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节,“死锁检测”.