1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Cetus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
mysql-xa-bug.md 5.2 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 21:41 e65dd39

Проблемы с транзакциями XA в MySQL

Обнаруженная проблема

В процессе тестирования Cetus была обнаружена ошибка в транзакциях XA MySQL версии 5.7.21. Метод тестирования: запуск тестового задания для имитации перевода средств между банковскими счетами, случайное уничтожение экземпляра MySQL на сервере с помощью команды kill -9 и перезапуск экземпляра. Были выявлены две ситуации с зависшими транзакциями:

Проявление проблемы

  1. Только основная база данных имеет зависшую транзакцию: Основная база данных MySQL получила уведомление о фиксации транзакции XA (XA commit), но до завершения фиксации была уничтожена с помощью kill -9. После перезапуска основной базы данных обнаружилась зависшая транзакция. В то же время в реплике распределённая транзакция уже была зафиксирована. Для фиксации распределённой транзакции в основной базе данных требуется выполнить команду XA commit. Это действие синхронизируется с репликой, что приводит к ошибке в приложении SQL, которое сообщает об отсутствии данной распределённой транзакции.

  2. Только реплика имеет зависшую транзакцию: Cetus отправляет запрос XA prepare на сервер. Запрос XA prepare принимается основной базой данных MySQL, но до его завершения основная база данных уничтожается с помощью kill -9, а затем перезапускается. Основная база данных возвращается к предыдущему состоянию, и зависшей транзакции нет. Однако в реплике возникает зависшая транзакция. Чтобы обеспечить согласованность данных, необходимо откатить транзакцию XA в реплике.

В обоих случаях состояние транзакции XA основной базы данных не соответствует состоянию, записанному в двоичном журнале. Согласно документации MySQL, неожиданное завершение работы может привести к несогласованности состояния базы данных и двоичного журнала. Эти ошибки возникают только при ненормальном завершении работы MySQL и не проявляются при нормальном завершении. Если возникает зависание транзакции XA, можно использовать инструмент обработки зависания XA от Cetus для автоматического решения проблемы.

Официальное описание

XA не полностью устойчива к неожиданному завершению работы относительно двоичного журнала (на мастере). Если происходит неожиданное завершение перед XA PREPARE, между XA PREPARE и XA COMMIT (или XA ROLLBACK) или после XA COMMIT (или XA ROLLBACK), сервер и двоичный журнал корректно восстанавливаются и переходят в согласованное состояние. Однако если происходит неожиданное прерывание во время выполнения одного из этих операторов, сервер может не восстановиться до правильного состояния, оставляя сервер и двоичный журнал в несогласованном состоянии.

Отправленная в официальный баг XA: «XA prepare записывается раньше engine prepare». https://bugs.mysql.com/bug.php?id=76233

Детальная проверка

Детальная проверка ошибки XA в MySQL 5.7.21 включает анализ внешних проявлений и анализ кода.

Внешние проявления ошибки XA MySQL 5.7.21: https://github.com/Lede-Inc/cetus/blob/master/doc/MySQL-5.7.21-XA-bug-phenomena.pdf

Анализ кода ошибки XA MySQL 5.7.21: https://github.com/Lede-Inc/cetus/blob/master/doc/MySQL-5.7.21-XA-bug-code-analysis.pdf

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-Cetus.git
git@api.gitlife.ru:oschina-mirror/mirrors-Cetus.git
oschina-mirror
mirrors-Cetus
mirrors-Cetus
master