2并发不启动事务。
并发A依次锁1-3-5,当然,实际的锁定过程必须是由one.Concurrent B锁5-8-1顺序进行的,当然,实际的锁定过程必须是一个接一个的。(1-3-5和5-8-1是主键)
假设当并发A锁到1-3,并发B锁到5-8,并发A锁5和等待,并发B锁1和wait.Is有可能导致死锁吗?
如果是这样的话,为什么MySQL不自动提供并发退出锁以避免死锁?
假设事务被打开,这个机制肯定是不允许的,因为结果已经在transaction.If中返回--不打开事务,原则上是可以的。
发布于 2022-12-18 06:51:09
您可以得到一个死锁;您不能总是避免它。但你可以恢复。
线程A:
BEGIN; -- Yes, you must start a transaction
lock row with id=1
lock row with id=5
...
COMMIT;
线程B:
BEGIN;
lock row with id=5
lock row with id=1
...
COMMIT;
这是典型的死锁示例。
如果线程A抓取第1行,在线程B抓取第5行之后到达第5行,则每个线程都在等待另一行。
InnoDB很聪明,可以看到没有办法解决问题,所以它选择了一个事务来终止。在这样做的过程中,它取消了该事务已经完成的任何操作。同时,另一个线程可以继续。
因此,如果在每个语句(甚至是COMMIT
)之后检查错误,就会捕获死锁。在这一点上,通常需要做的‘正确’事情是简单地重新启动事务(因为线程有死锁)。
( BEGIN
和COMMIT
之间的事务)是“锁定行”所必需的。所以,我不明白你所说的没有交易的锁定是什么意思。
https://dba.stackexchange.com/questions/321115
复制相似问题