При параллельном выполнении нескольких транзакций в большинстве случаев я захожу в тупик:
------------------------
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 удерживает блокировку первичного индекса _2 _._ 3_. В то же время транзакция 2 также ожидает такой же блокировки. Как это возможно, что одна транзакция удерживается и ожидает одной и той же блокировки?
Я ошибаюсь из этих утверждений? Как я могу продолжить решение этих тупиковых ситуаций. Кроме того, взаимоблокировки предназначены только для таблиц AUD, которые поддерживаются за кулисами envers, как это решить?
UPDATE
ясно, что вы используетеValidityAuditStrategy
и обновляете столбецREVEND
более старой записи при создании новой строки аудита. У вас не должно возникать взаимоблокировок, если вы не пытаетесь выполнить какое-либо поведение вложенной транзакции для одного и того же объекта. Трудно сказать, не видя вашего java-кода и обработки транзакций. - person Naros   schedule 04.09.2019SHOW CREATE TABLE VerificationActionLog_AUD
и несколько подсказок о том, что еще находится в той же транзакции. Кроме того, были ли они в «конце» таблицы? - person Rick James   schedule 06.09.2019