根据好消息,
InnoDB使用自动行级锁定。即使在只插入或删除一行的事务的情况下,也可能出现死锁。这是因为这些操作并不是真正的"原子"操作;它们会自动对插入或删除的行的(可能有几个)索引记录设置锁。
两个进程如何可能在一条记录上死锁?
因为两个进程在一笔交易中持有完全相同的行(例如银行账户),并希望对其进行更改。
因此,在同一银行账户的情况下,如果需要进行一次提款,那么另一次提款还不可能发生,因为你可能会遇到银行账户可能没有足够的钱进行第二次提款的情况。
死锁的想法是在尽可能短的时间内保持锁定。
以下是从Rick James评论中提供的URL中提取的示例:
客户端1(C1) | 客户端2(C2) | |
---|---|---|
1 | 启动事务 | |
2 | 在共享模式下,从t中选择*i=1锁定 | |
3 | 启动事务 | |
4 | 从t删除,其中i=1 | |
5 | 从t删除,其中i=1 |