MySQL中的死锁和锁等待超时的区别

11

有人可以详细解释一下MySQL 5.1中发现的死锁和锁等待错误的区别吗?它们是完全相同的吗?死锁错误是什么时候发生的,锁等待超时又是什么时候发生的?

2个回答

35
发生死锁时,事务必须获取的锁之间存在循环依赖。例如,假设事务1持有锁A但需要获取锁B才能继续进行;而事务2持有锁B但需要获取锁A才能继续进行——这些事务会立即死锁(无需超时),并且都无法继续执行直到其中一个释放其所持有的锁。因此,数据库选择一个事务进行中止/回滚;应用程序代码应检测到这种情况并相应地处理,通常是尝试再次执行事务。死锁类似于警察解决gridlock(在道路交叉口处没有车辆能够前进的情况)的方法,即命令随机参与者倒退。
一个等待超时发生在配置的超时时间段(例如,对于InnoDB锁,innodb_lock_wait_timeout)在事务等待锁时到期,可能是因为一个缓慢的事务持有锁并且没有完成执行,或者可能是因为许多事务正在排队等待锁。可能(甚至很可能)如果事务等待更长时间,锁就会变得可用并被获取,但超时存在是为了避免应用程序无限期地等待数据库。等待超时类似于司机因为延误而放弃并返回。

-2

死锁是指两个线程无限期地等待同一件事情。 锁等待超时意味着一个线程在等待获取锁的过程中超时了,从而防止了死锁的发生。


3
这篇帖子中的大部分内容都是错误的。新人请参考eggyal的答案。 - Jacky Cheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接