10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

15.7.5 InnoDB中的死锁

死锁是一种不同的事务无法继续进行的情况,因为每个事务都持有另一个事务需要的锁。因为两个事务都在等待一个资源变得可用,所以它们都不会释放它持有的锁。

当事务锁定多个表中的行时(通过诸如更新选择……更新),但顺序相反。当此类语句锁定索引记录和间隙范围时,也会发生死锁,每个事务由于时间问题获取一些锁,但没有获取其他锁。有关死锁的示例,请参见第15.7.5.1节,InnoDB死锁示例

为了减少死锁的可能性,使用事务而不是锁表语句;保持插入或更新数据的事务足够小,以免长时间处于打开状态;当不同的事务更新多个表或大范围的行时,使用相同的操作顺序(例如选择……更新);中使用的列上创建索引选择……更新更新……在哪里语句。死锁的可能性不受隔离级别的影响,因为隔离级别会更改读操作的行为,而死锁是由于写操作而发生的。有关避免死锁条件和从死锁条件中恢复的详细信息,请参见第15.7.5.3节,“如何最小化和处理死锁”

当死锁检测被启用(默认)并且死锁确实发生时,InnoDB检测条件并回滚一个事务(受害者)。方法禁用死锁检测innodb_deadlock_detect变量,InnoDB依赖于innodb_lock_wait_timeout设置为在死锁时回滚事务。因此,即使您的应用程序逻辑是正确的,您仍然必须处理必须重试事务的情况。控件中的最后一个死锁InnoDB用户事务,使用显示引擎的innodb状态.如果频繁死锁突出了事务结构或应用程序错误处理的问题,启用innodb_print_all_deadlocks将所有死锁的信息打印到mysqld错误日志。有关自动检测和处理死锁的详细信息,请参见第15.7.5.2节,“死锁检测”