MySQL 8.0发布说明
MySQL 8.0源码文档10bet官方网站
死锁是一种不同的事务无法继续进行的情况,因为每个事务都持有另一个事务需要的锁。因为两个事务都在等待一个资源变得可用,所以它们都不会释放它持有的锁。
当事务锁定多个表中的行时(通过诸如更新
或选择……更新
),但顺序相反。当此类语句锁定索引记录和间隙范围时,也会发生死锁,每个事务由于时间问题获取一些锁,但没有获取其他锁。有关死锁的示例,请参见第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节,“死锁检测”.