У меня возникли проблемы с поиском ответа с помощью Google или Stack Overflow, поэтому, возможно, люди, знакомые с Percona XtraDB, смогут ответить на этот вопрос. Я полностью понимаю, как могут возникать неожиданные взаимоблокировки, как описано в этой статье, и решение состоит в том, чтобы завернуть свои транзакции в логику повторных попыток, чтобы вы могли перезапустить их в случае сбоя. Мы это уже делаем.
Мои вопросы касаются обычных обновлений, которые происходят вне транзакции в режиме автоматической фиксации. Обычно, если вы пишете только в одну базу данных SQL и выполняете обновление, вы получаете сценарий «последний в выигрыше», поэтому тот, кто выполняет оператор последним, будет золотым. Любые другие данные теряются, поэтому, если два обновления происходят одновременно, одно из них будет сохранено, а данные других по существу потеряны.
Что же происходит в среде с несколькими мастерами с одним и тем же? Разница в режиме кластера с несколькими мастерами заключается в том, что взаимоблокировка может возникнуть в момент фиксации, а не в момент, когда блокировка была впервые снята с таблицы. Таким образом, в режиме автоматической фиксации данные будут записаны в БД, но затем он может выйти из строя, когда он попытается зафиксировать это на других узлах в кластере, если что-то еще изменило ту же самую запись в то же время. Очевидно, что простое решение - повторно выполнить обновление снова, и мне кажется, что сама база данных должна справиться с этим, поскольку это единственный оператор в режиме автоматической фиксации?
Так вот что происходит в этом сценарии, или мне нужно начать упаковывать весь мой код обновления в обработку повторных попыток и повторить попытку самостоятельно, когда это не удается?