9

谁能详细解释一下 MySQL 5.1 上发现的死锁和 Lockwait 错误的区别。是一样的吗?什么时候发生死锁错误,什么时候发生lockwait timeout?

4

2 回答 2

33

每当事务必须获取才能继续执行的锁之间出现循环依赖关系时,就会发生死锁:例如,假设事务 1 持有锁 A,但需要获取锁 B 才能继续;事务 2 持有锁 B,但需要获取锁 A 才能继续执行 - 事务立即死锁(不需要超时),并且在释放锁之前都无法继续。因此数据库选择一个事务来中止/回滚;应用程序代码应该检测到这种可能性并相应地处理,通常是通过再次尝试事务。死锁类似于警察通过命令随机参与者倒车来解决僵局(在路口的情况,当没有车辆能够前进时)。

当配置的超时时间(例如,在 InnoDB 锁的情况下)在事务等待锁时过去时会发生等待超时innodb_lock_wait_timeout ,可能是因为缓慢的事务正在持有锁并且尚未完成执行,或者可能是因为许多事务正在排队等待锁。如果事务等待更长的时间,有可能(甚至很可能)锁已经可用并且已经被获取,但是存在超时是为了避免应用程序无限期地等待数据库。等待超时类似于驾驶员因延误而放弃并返回。

于 2013-05-15T12:00:37.773 回答
-2

死锁是两个线程无限等待同一件事。锁等待超时意味着一个线程在等待获得锁时超时,从而防止了死锁。

于 2013-05-16T04:56:12.807 回答