【发布时间】:2020-01-07 00:10:51
【问题描述】:
在并行运行少量事务时,大多数时候我会陷入死锁:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-09-04 06:19:12 0x2b01917c7700
*** (1) TRANSACTION:
TRANSACTION 14470484, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 13 lock struct(s), heap size 1136, 7 row lock(s), undo log entries 4
MySQL thread id 69372, OS thread handle 47285779531520, query id 10366178979 172.31.19.11 master updating
update `VerificationActionLog_AUD` set `REVEND`=427956 where `id`=138136 and `REV`<> 427956 and `REVEND` is null
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 7307 page no 1108 n bits 128 index PRIMARY of table `TestDB`.`VerificationActionLog_AUD` trx id 14470484 lock_mode X waiting
Record lock, heap no 60 PHYSICAL RECORD: n_fields 27; compact format; info bits 0
...
*** (2) TRANSACTION:
TRANSACTION 14470485, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
11 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 4
MySQL thread id 69395, OS thread handle 47285735814912, query id 10366178981 172.31.19.11 master updating
update `VerificationActionLog_AUD` set `REVEND`=427957 where `id`=138137 and `REV`<> 427957 and `REVEND` is null
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 7307 page no 1108 n bits 128 index PRIMARY of table `TestDB`.`VerificationActionLog_AUD` trx id 14470485 lock_mode X locks rec but not gap
Record lock, heap no 60 PHYSICAL RECORD: n_fields 27; compact format; info bits 0
...
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 7307 page no 1108 n bits 128 index PRIMARY of table `TestDB`.`VerificationActionLog_AUD` trx id 14470485 lock_mode X waiting
Record lock, heap no 60 PHYSICAL RECORD: n_fields 27; compact format; info bits 0
...
*** WE ROLL BACK TRANSACTION (2)
我试图推断这些陈述所解释的内容。据我了解,事务2持有TestDB.VerificationActionLog_AUD的主索引的锁。与此同时,事务 2 也在等待同一个锁。单个事务怎么可能持有并等待同一个锁?
我从这些陈述中推断错了吗?我该如何继续解决这些死锁。此外,死锁仅适用于由 envers 在后台维护的 AUD 表,如何解决此问题?
【问题讨论】:
-
从
UPDATE语句中可以清楚地看出,您正在使用ValidityAuditStrategy并在生成新的审计行时更新旧记录的REVEND列。除非您尝试在同一实体上执行某些嵌套事务行为,否则您不应该遇到死锁。没有看到你的 java 代码和事务处理,很难说。 -
@Naros 感谢您的评论。虽然仍然无法解决它,但现在我有了更好的理解。我有几个问题。 MySQL有嵌套事务吗?我们手动开始并提交事务。我不认为我们在已经运行的事务中开始事务的任何部分。但是我们在事务之间进行刷新。手动刷新会导致嵌套事务吗?
-
请提供
SHOW CREATE TABLE VerificationActionLog_AUD以及有关同一事务中其他内容的一些线索。另外,这些是在桌子的“末端”吗? -
解释一下你所说的“冲洗”是什么意思。
-
我们正在使用休眠。 stackoverflow.com/questions/3220336/… 给出了很好的解释。也检查答案 2
标签: mysql hibernate hibernate-envers database-deadlocks