14.7.5.3 如何最小化和处理死锁

本节以有关第 14.7.5.2 节“死锁检测和回滚”中的死锁的概念性信息为基础。它说明了如何组织数据库操作以最大程度地减少死锁和应用程序中所需的后续错误处理。

Deadlocks是事务数据库中的经典问题,但是它们并不危险,除非它们如此频繁以至于您根本无法运行某些事务。通常,您必须编写应用程序,以便在由于死锁而使事务回滚时,它们始终准备重新发出事务。

InnoDB使用自动行级锁定。即使在仅插入或删除单行的事务中,也可能会遇到死锁。这是因为这些操作并不是 true 的“原子”操作;它们会自动对插入或删除的行的(可能是多个)索引记录设置锁定。

您可以使用以下技术来处理死锁并减少发生死锁的可能性:

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

table 级锁可防止对 table 的并发更新,从而避免死锁,但代价是对繁忙系统的响应速度较慢。

首页