谁能详细解释一下 MySQL 5.1 上发现的死锁和锁等待错误的区别。难道只是一样吗?什么时候会发生死锁错误,什么时候会发生lockwait超时?
A deadlock每当事务必须获取锁才能继续进行时,就会发生循环依赖关系:例如,假设事务 1 持有锁 A,但需要获取锁 B 才能继续;事务 2 持有锁 B 但需要获取锁 A 才能继续——事务是立即地死锁(不需要超时)并且在释放其锁之前都无法继续。因此,数据库选择一个事务来中止/回滚;应用程序代码应该检测这种可能性并进行相应处理,通常是再次尝试事务。僵局类似于警察解决问题gridlock https://en.wikipedia.org/wiki/Gridlock(路口没有车辆能够前进的情况)通过命令随机参与者倒车。
A 等待超时当配置的超时时间(例如innodb_lock_wait_timeout http://dev.mysql.com/doc/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout在事务等待锁时,时间会过去(对于 InnoDB 锁),这可能是因为慢速事务正在持有锁并且尚未完成执行,或者可能是因为许多事务正在排队等待锁。如果事务等待的时间更长,锁可能(甚至很可能)变得可用并已被获取,但超时的存在是为了避免应用程序无限期地等待数据库。等待超时类似于驾驶员因延误而放弃并返回。