mysql - MySQL 上的死锁与锁等待超时

标签 mysql deadlock

<分区>

任何人都可以详细解释一下在 MySQL 5.1 上发现的死锁和 Lockwait 错误的区别。只是一样吗?什么时候发生死锁错误,什么时候发生lockwait超时?

最佳答案

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

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

关于mysql - MySQL 上的死锁与锁等待超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563843/

相关文章:

mysql - 死锁后在 MySQL 中重新启动事务

java - 银行转账同步

mysql - 向 mysql 新字段添加值

c# - 如何使用 linq 从表中跳过重复的 id 并选择仍然存在

PHP/Mysqli 插入语句不写入数据库

java - 保证死锁

php - 从数据库中检索数据时php中的问题

mysql - 仅对连续行进行 SQL Group By

go - 为什么这会导致 Go 中的死锁?

多线程事务的 MySQL 配置