Взаимные блокировки являются обычной частью любой транзакционной базы данных и могут возникнуть в любое время. Как правило, вы должны написать код своего приложения для их обработки, поскольку нет надежного способа гарантировать, что вы никогда не получите тупик. При этом существуют ситуации, которые увеличивают вероятность возникновения взаимоблокировок, например, использование больших транзакций, и есть вещи, которые вы можете сделать, чтобы смягчить их возникновение.
Прежде всего, вам следует прочитать эту страницу руководства , чтобы лучше понять, как их можно избежать.
Во-вторых, если все, что вы делаете - это обновляете счетчик, вам действительно нужно использовать столбец AUTO_INCREMENT для Counter
вместо того, чтобы полагаться на процесс «выбрать и обновить», который, как вы видели, состояние гонки, которое может привести к тупикам. По сути, свойство AUTO_INCREMENT вашего столбца таблицы будет действовать как счетчик для вас.
Наконец, я собираюсь предположить, что у вас есть этот оператор обновления внутри транзакции, так как это приведет к частым взаимоблокировкам. Если вы хотите увидеть его в действии, попробуйте эксперимент, указанный здесь . Это именно то, что происходит с вашим кодом ... два потока пытаются обновить одни и те же записи одновременно, прежде чем один из них будет зафиксирован. Мгновенный тупик.
Ваше лучшее решение - выяснить, как это сделать без транзакции, и AUTO_INCREMENT позволит вам сделать это.