当两个事务中,都会同一行记录进行操作的时候,可能会触发死锁,最终抛出超时异常
验证如下
首先在当前的数据库连接会话中
将数据库事务设置为手动提交
set @@autocommit=0;
SHOW VARIABLES like ‘%autocommit%’
然后在当前会话中
执行, 但先不commit

这个时候在该会话中,事务还没提交
此时在该会话中去查询

数据已经看不到了。

但是此时在另一个会话中 ,数据还在,因为之前那个会话的事务没有提交

如果在另一个会话中,也对这行记录进行操作

因为会话1的事务没有提交,且在会话1中对记录为aaa的行进行了加锁
此时会话2也去对记录为aaa的行进行删除,需要去等待会话1将锁释放。
但是等待时间在SHOW VARIABLES LIKE ‘innodb_lock_wait_timeout’; 可

本文探讨了在MySQL中,当两个事务并发操作同一行记录可能导致的死锁问题,最终引发'lock wait timeout exceeded'异常。通过设置事务为手动提交,并演示了两个会话如何产生锁等待,指出长时间事务可能引发的问题,建议避免在代码中使用耗时大的事务以防止锁超时和死锁情况的发生。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



