innodb_deadlock_detect
此选项用于禁用死锁检测。在高并发系统上,当多个线程等待相同的锁时,死锁检测会导致速度变慢。有时,在发生死锁时,禁用死锁检测并依赖innodb_lock_wait_timeout设置进行事务回滚可能更有效。
死锁检测
MySQL默认情况下是开启了死锁检测的,InnoDB会自动检测事务死锁并回滚一个或多个事务以打破死锁。InnoDB尝试选择小事务进行回滚,其中事务的大小由inserted, updated, deleted的行数决定。
如果InnoDB_table_locks=1(默认值)和autocommit=0,则InnoDB能感知到表锁的存在,并且上层的MySQL层知道行级锁。否则,如果涉及MySQL lock TABLES语句设置的表锁或InnoDB以外的存储引擎设置的锁,InnoDB无法检测死锁。通过设置innodb_lock_wait_timeout系统变量的值来解决这些情况。
如果InnoDB监控器输出的最近死锁检测部分包含一条消息,指出TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACTION,这表示处于等待的事务列表长度已达到限制200。超过200个事务的等待列表被视为死锁,并且将回滚尝试检查等待列表的事务。 如果锁定线程必须查看等待列表上的事务拥有的超过1,000,000个锁,则也可能发生相同的错误。
这里顺便提下相关联两个参数
innodb_lock_wait_timeout
InnoDB事务在放弃之前等待行锁的时间长度(秒)。默认值为50秒。试图访问被另一个InnoDB事务锁定的行的事务最多等待此数秒以获取对该行的写访问权限,然后发出以下错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
当锁等待超时发生时,将回滚当前语句(而不是整个事务)。要回滚整个事务,请使用 --innodb-rollback-on-timeout选项启动服务器。
对于高度交互的应用程序或OLTP系统,可以减小此值,以便快速显示用户反馈或将更新放入队列中以便稍后处理。对于长时间运行的后端操作,例如等待其他大型插入或更新操作完成的数据仓库中的转换步骤,可以增加此值。
innodb_lock_wait_timeout仅适用于innodb行锁。在InnoDB内部不会发生MySQL表锁,这个超时不适用于等待表锁。
当启用innodb_deadlock_detect(默认设置)时,lock wait timeout值不适用于死锁,因为innodb会立即检测死锁并回滚其中一个死锁事务。当innodb_deadlock_detect被禁用时,当发生死锁时,innodb依赖innodb_lock_wait_timeout进行事务回滚
innodb_rollback_on_timeout
InnoDB 默认情况下,仅回滚事务超时上的最后一条语句;如果开启则事务超时导致 InnoDB中止并回滚整个事务。
本文介绍了MySQL InnoDB存储引擎中的死锁检测机制及其配置参数。包括innodb_deadlock_detect的作用及如何通过设置innodb_lock_wait_timeout来处理死锁。同时讨论了innodb_rollback_on_timeout选项如何影响事务回滚。

2421

被折叠的 条评论
为什么被折叠?



