Хорошая идея - сначала попытаться использовать сериализуемый уровень изоляции в вашей транзакции. Это означает, что вы по крайней мере знаете, что такое переход, и что уровень изоляции является одной из самых больших проблем.
Обратите внимание, что сериализуемый на самом деле не настоящая надежность. Подробнее об этом на этом предыдущем ответе , когда у вас будет время прочитать его: -).
Но самая важная часть заключается в том, что вы должны учитывать, что автоматические откаты для вашей транзакции из-за неудачной сериализуемости являются нормальным фактом, и что правильное решение состоит в том, чтобы построить приложение так, чтобы транзакции могли завершиться неудачей и должны быть воспроизведены.
Одно простое решение, и для учета вещей мне нравится это простое решение, так как мы можем предсказать все факты, без каких-либо неожиданностей, поэтому одним из решений является блокировка таблицы . Это не изящное и элегантное решение, без блокировок уровней строк, просто простые блокировки больших таблиц (и всегда в том же порядке). После этого вы можете выполнять свои действия в качестве одиночного игрока, а затем снимать блокировки. Не многопользовательский параллелизм в строках таблиц, никакие магические блокировки в следующем ряду не дают ошибок (см. Предыдущую ссылку). Это, безусловно, замедлит ваши операции записи, но если все выполнят блокировки таблиц в одном и том же порядке, вы получите только проблемы с тайм-аутами блокировок, без тупиков и без «несериализуемого автоматического отката».
Редактировать
Из вашего примера кода я не уверен, что вы можете установить уровень изоляции транзакции после начала. Вы должны активировать журналы запросов на MySQL и выполнить все это, а затем проверить, что другие транзакции, выполняемые CMS, все еще не находятся на уровне сериализации.