文章目录
- 检测死锁
- 选择事务回滚
- 客户端重试
在MySQL中,死锁是指两个或多个事务相互等待对方持有的资源,从而导致这些事务无法继续执行。
MySQL通过以下流程来处理死锁:
检测死锁
MySQL的存储引擎(例如InnoDB)会在事务等待锁的过程中自动检测死锁。一旦检测到死锁,存储引擎会主动进行处理。
选择事务回滚
当检测到死锁后,MySQL会选择一个合适的事务作为“死锁牺牲者”,将其回滚,释放已持有的锁,从而解除死锁。
InnoDB
通常选择代价最小的事务作为牺牲者。代价通常根据事务已经修改的数据量、事务所持有的锁数量等因素进行评估。
客户端重试
应用程序接收到死锁错误后,通常会进行相应的处理,比如重试该事务。这需要在应用层代码中实现逻辑,对捕获到的 ER_LOCK_DEADLOCK
错误进行处理,并合理地重试事务。