Может возникнуть тупик, когда транзакция 1 получает (для записи) ресурс A, а тем временем транзакция 2 получает ресурс B.
Теперь представьте, что транзакция 2 хочет ресурс A, но занята, поэтому ей приходится ждать, и транзакция пытается получить ресурс B и тоже находит его занятым. У тебя круговое ожидание, тупик. Транзакция 1 ожидает ресурс, который содержит транзакция 2, а транзакция 2 ожидает ресурс транзакции 1. Ни одна транзакция не может быть продолжена. Это самый простой пример, цепочка может быть длиннее.
MySQL InnoDB обнаруживает взаимоблокировки и завершает одну из транзакций, приводя к сбою.
Что вы можете сделать, чтобы избежать этой проблемы:
- просто повторите попытку транзакции, например, вы можете повторить 3 раза (протестировано в средах с высоким параллелизмом, работает как чудо)
- получить ресурсы в том же порядке. Если транзакции 1 и 2 требуют первого ресурса A, а затем B, в том же порядке, проблема не может возникнуть