我们在 Amazon RDS 平台中托管 MySQL 数据库。我们看到很多由于锁定而导致的死锁问题。我试图理解死锁转储报告,它粗略地描述了受影响的事务和锁的数量等。以下是这样的跟踪:
2017-12-14 09:00:21 2ba3a5758700
*** (1) TRANSACTION:
TRANSACTION 1297355720, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 7 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 1
MySQL thread id 9198894, OS thread handle 0x2ba0b33da700, query id 5198593130
在上面的跟踪中,第 4 行显示 - 'mysql 表正在使用 1,已锁定 1
'。 “锁定 1”是什么意思?这是否意味着相关表在事务期间被完全锁定?
我们没有显式锁定表。我们在某些地方使用 Django @transaction.atomic,但我们的代码中没有显式的表锁定。
请帮助我了解如何调试表锁定问题。
最佳答案
检查所有有@transaction.atomic的地方,看看它们是否在每个这样的代码块中以相同的顺序修改表。如果不是 - 这是最有可能发生死锁的地方。
关于Amazon RDS 中的 MySQL 表锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817999/