В InnoDB все sql в транзакции? - PullRequest
1 голос
/ 06 марта 2019

Кажется, у меня неправильное представление о том, что:

update table_name set id=222 where id >333;

мое старое мнение выше одного SQL без begin и commit не будет запускать транзакцию. но это кажется неправильным.


Но когда я прочитал mysql doc , я обнаружил, что кажется, что все sql будут в транзакции. Если вы явно не используете begin и commit, он запустит транзакцию, неявную в InnoDB .

В InnoDB все действия пользователя происходят внутри транзакции. Если включен режим автоматической фиксации, каждый оператор SQL самостоятельно формирует одну транзакцию. По умолчанию MySQL запускает сеанс для каждого нового соединения с включенной автоматической фиксацией, поэтому MySQL выполняет коммит после каждого оператора SQL, если этот оператор не возвращал ошибку. Если инструкция возвращает ошибку, поведение фиксации или отката зависит от ошибки. См. Раздел 14.21.4, «Обработка ошибок InnoDB».

мой вопрос:

Все ли sql будет работать в транзакции, независимо от того, явно ли вы используете begin и commit.

1 Ответ

4 голосов
/ 06 марта 2019

оно будет выполнено в отдельных транзакциях - если только операторы группировки не объединены с START TRANSACTION & COMMIT (конфигурация autocommit будет игнорироваться, независимо от ее значения). SET autocommit = 0/1 может использоваться для контроля уровня изоляции на лету. для этого есть также опция конфигурации, чтобы изменить глобальное поведение:

[mysqld]
autocommit=0

документация для "Системных переменных сервера" объясняет это подробно:

Режим autocommit. Если установлено значение 1, все изменения в таблице вступают в силу немедленно. Если установлено значение 0, вы должны использовать COMMIT для принятия транзакции или ROLLBACK для ее отмены. Если autocommit равно 0 и вы изменили его на 1, MySQL автоматически выполнит COMMIT любой открытой транзакции. Другой способ начать транзакцию - использовать оператор START TRANSACTION или BEGIN.

...