我使用JMeter测试我的程序,不知何故总响应数停止增加,然后我发现在MySQL中有一个死锁。我不明白下面的log是什么意思。似乎transaction(2)拥有一个S锁,并试图拥有同一个表的X锁。-*** (1) TRANSACTION:mysqltables in use 2, locked 2
LOCK WAIT 5 lock struct(s), heap s
我对mysql事务感到困惑。我有一个表格,如下所示。我过去常常使用表锁来避免竞争条件,但它会导致死锁。所以现在我想用事务来代替。但是我对事务的锁定作用域感到困惑。事务中的所有查询是否都是原子执行的,因此不会出现竞争条件?或者mysql只是锁定"select ... for update“和"commit”之间的行?
除非DB知道事务中的所有查询(这违背了两阶段锁定机制的全部要点,这种机制应该能够在不知道事务中的所有查询的情况下确保可序列化),否则无法判断事务是否需要获得更多的锁。假设我有如下事务:select * from test_tab where id=1;updatetest_tab set age=100 where id=3;从上面的事务来看,在完成最后一个u