19.5.1.35 Репликация и транзакции
Смешивание транзакционных и не транзакционных инструкций в рамках одной транзакции. В общем случае следует избегать транзакций, обновляющих как транзакционные, так и не транзакционные таблицы в среде репликации. Также следует избегать инструкций, которые обращаются к обеим типам таблиц (транзакционным или временным) и записывают данные в любую из них.
Сервер использует следующие правила для двоичного логгирования:
Если начальные инструкции в транзакции являются не транзакционными, они записываются в двоичный лог немедленно. Остальные инструкции в транзакции кешируются и не записываются в двоичный лог до тех пор, пока транзакция не будет подтверждена. (Если транзакция отменяется, кешированные инструкции записываются в двоичный лог только в случае, если они внесли изменения в не транзакционные таблицы, которые нельзя отменить. В противном случае они отбрасываются.)
Для логгирования инструкций, логгирование не транзакционных инструкций зависит от системной переменной
binlog_direct_non_transactional_updates. Когда эта переменная имеет значениеOFF(значение по умолчанию), логгирование происходит так, как описано выше. Когда эта переменная имеет значениеON, логгирование происходит немедленно для всех не транзакционных инструкций в рамках транзакции (а не только для начальных не транзакционных инструкций). Другие инструкции сохраняются в кэше транзакции и записываются в лог при подтверждении транзакции.binlog_direct_non_transactional_updatesне влияет на логгирование в формате строки или смешанном формате двоичного лога.
Транзакционные, не транзакционные и смешанные инструкции. Для применения этих правил сервер рассматривает инструкцию как не транзакционную, если она изменяет только не транзакционные таблицы, и как транзакционную, если она изменяет только транзакционные таблицы. Инструкция, которая ссылается на обе таблицы (не транзакционные и транзакционные) и обновляет любую из этих таблиц, считается “смешанной” инструкцией. Смешанные инструкции, как и транзакционные, кешируются и записываются в лог при подтверждении транзакции.
Смешанная инструкция, обновляющая транзакционную таблицу, считается небезопасной, если она также выполняет одно из следующих действий:
Обновляет или считывает временную таблицу
Считывает не транзакционную таблицу, и уровень изоляции транзакции меньше REPEATABLE_READ
Смешанная инструкция, следующая за обновлением транзакционной таблицы в рамках транзакции, считается небезопасной, если она выполняет одно из следующих действий:
Обновляет любую таблицу и считывает данные из любой временной таблицы
Обновляет не транзакционную таблицу и
binlog_direct_non_transactional_updatesвыключен
Дополнительную информацию см. в Разделе 19.2.1.3, «Определение безопасных и небезопасных инструкций в двоичном логгировании».
Смешанная инструкция не связана с форматом смешанного двоичного логгирования.
В ситуациях, когда транзакции смешивают обновления транзакционных и не транзакционных таблиц, порядок инструкций в двоичном логе корректен, и все необходимые инструкции записываются в двоичный лог даже в случае отмены (ROLLBACK). Однако, если второе подключение обновит не транзакционную таблицу до завершения транзакции первого подключения, инструкции могут быть залогированы в неправильном порядке, поскольку обновление второго подключения записывается сразу после его выполнения, независимо от состояния транзакции, выполняемой первым подключением.
Использование разных типов хранилищ на источнике и реплике. Возможно, транзакционные таблицы на источнике реплицируются с помощью не транзакционных таблиц на реплике. Например, вы можете реплицировать таблицу InnoDB на источнике как таблицу MyISAM на реплике. Однако, если вы это сделаете, возникнут проблемы, если реплика остановится посреди блока BEGIN ... COMMIT, потому что реплика перезапускается в начале блока BEGIN.
Также безопасно реплицировать транзакции из таблиц MyISAM на источнике в транзакционные таблицы, такие как таблицы, использующие двигатель хранилища InnoDB на реплике. В таких случаях инструкция AUTOCOMMIT=1 на источнике реплицируется, тем самым применяя режим AUTOCOMMIT на реплике.
Если тип двигателя хранилища реплики является не транзакционным, транзакции на источнике, которые смешивают обновления транзакционных и не транзакционных таблиц, следует избегать, поскольку это может привести к несогласованности данных между транзакционной таблицей на источнике и не транзакционной таблицей на реплике. То есть, такие транзакции могут привести к поведению, специфичному для двигателя хранилища источника, с возможным эффектом разсинхронизации репликации. MySQL не выдает предупреждение об этом, поэтому при репликации транзакционных таблиц с источника в не транзакционные таблицы на репликах следует проявлять особую осторожность.
Изменение формата двоичного логгирования внутри транзакций. Системные переменные binlog_format и binlog_checksum являются только для чтения, пока транзакция находится в процессе.
Каждая транзакция (включая транзакции autocommit) записывается в двоичный лог так, как будто она начинается с инструкции BEGIN, и заканчивается либо инструкцией COMMIT, либо инструкцией ROLLBACK. Это верно даже для инструкций, влияющих на таблицы, использующие не транзакционный двигатель хранилища (например, MyISAM).
Ограничения, которые применяются конкретно к транзакциям XA, см. в Разделе 15.3.8.3, «Ограничения на транзакции XA».
© 2025 Oracle
Licensed under the GPLv2 License.