Tx 1: lock A, then B Tx 2: lock B, then A
因为InnoDB在内部启动事务,所以你可以继续 遇到僵局。
无法逃避它。
当许多线程试图插入具有相同PK的行时,我看到错误代码1213,但我不明白如何有两个锁。是不是只有那一行的单锁?
答案 0 :(得分:0)
如果它是read lock
,则可以有多个,因为共享读锁,但任何时候只能有一个write lock
。每个DML操作(insert/update/delete
)都将在隐式事务上运行,并将在该行上保持行级锁定,因此如果任何其他线程尝试对该特定行执行写操作,则必须等待现有锁定由于写锁是独占锁,因此被释放。
您已发布 Tx 1:锁定A,然后B Tx 2:锁定B,然后A 肯定会导致deadlock
的情况,这就是锁定发生在两个阶段的原因。 Growing phase
当事务将获取执行事务所需的所有锁,Shrinking phase
何时它将开始释放该事务持有的锁。