任何人都可以向我详细解释MySQL 5.1上发现的死锁和Lockwait错误的区别。它是一样的吗?何时发生死锁错误以及何时发生lockwait超时?
答案 0 :(得分:18)
死锁发生在事务必须获取的锁之间存在循环依赖关系以便继续:例如,假设事务1持有锁A但需要获取锁B以继续;并且事务2持有锁B但需要获取锁A以继续 - 事务立即死锁(不需要超时),并且在释放其锁之前都不能继续。因此,唯一的解决方案是回滚一个事务(一个应用程序代码应该检测到这种可能性并相应地处理,通常是再次尝试事务)。
配置的超时期限(例如innodb_lock_wait_timeout
)发生等待超时
在InnoDB锁的情况下)在事务等待锁定时过去,可能是因为慢速查询持有锁并且还没有完成执行。如果事务等待的时间更长,则可能(甚至可能)锁定可用并获取,但存在超时以避免应用程序无限期地等待数据库。
答案 1 :(得分:0)
死锁是无线等待同一件事的两个线程。 锁定等待超时表示一个线程在等待获取锁定时超时,从而防止死锁。