Разница между SET autocommit = 1 и START TRANSACTION в mysql (я что-то пропустил?) - PullRequest
64 голосов
/ 01 июня 2010

Я читаю транзакции в MySQL и не уверен, правильно ли я понял что-то конкретное, и я хочу быть уверенным, что правильно понял, так что дальше. Я знаю, что должна делать транзакция, я просто не уверен, понял ли я семантику оператора или нет.

Итак, мой вопрос, что-то не так (и, если это так, то что-то не так) со следующим:

По умолчанию в MySQL включен режим автоматической фиксации.

Теперь SET autocommit=0; начнет транзакцию, SET autocommit=1; неявно подтвердит фиксацию. Возможно COMMIT;, а также ROLLBACK;, в обоих случаях autocommit по-прежнему имеет значение 0 (и новая транзакция неявно запускается).

START TRANSACTION; будет в основном SET autocommit=0;, пока не произойдет COMMIT; или ROLLBACK;.

Другими словами, START TRANSACTION; и SET autocommit=0; эквивалентны, за исключением того факта, что START TRANSACTION; эквивалентно неявному добавлению SET autocommit=0; после COMMIT; или ROLLBACK;

Если это так, я не понимаю http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable - видение того, что наличие уровня изоляции подразумевает, что есть транзакция, означает, что автокоммит должен быть отключен в любом случае?

А если есть другое различие (кроме описанного выше) между началом транзакции и настройкой автоматической фиксации, что это такое?

Ответы [ 3 ]

64 голосов
/ 01 июня 2010

Знание обработки транзакций (автокоммит, явный и неявный) для вашей базы данных может избавить вас от необходимости восстанавливать данные из резервной копии.

Транзакции управляют оператором (ами) обработки данных, чтобы гарантировать их атомарность. Быть «атомным» означает, что транзакция либо происходит, либо нет. Единственный способ сообщить о завершении транзакции в базу данных - использовать оператор COMMIT или ROLLBACK (согласно ANSI-92, который, к сожалению, не включает синтаксис для создания / начала транзакции, поэтому он зависит от поставщика). COMMIT применяет изменения (если таковые имеются), сделанные в рамках транзакции. ROLLBACK игнорирует любые действия, которые имели место в транзакции - очень желательно, когда инструкция UPDATE / DELETE делает что-то непреднамеренное .

Обычно отдельные операторы DML (вставка, обновление, удаление) выполняются в транзакции автоматического подтверждения - они фиксируются, как только оператор успешно завершается. Это означает, что нет возможности откатить базу данных до состояния до запуска оператора в таких случаях, как ваш. Если что-то идет не так, единственный доступный вариант восстановления - восстановить данные из резервной копии (если она существует). В MySQL значение autocommit по умолчанию равно для для InnoDB - MyISAM не поддерживает транзакции. Его можно отключить с помощью:

SET autocommit = 0

Явная транзакция - это когда оператор (ы) заключен в явно заданный блок кода транзакции - для MySQL, это START TRANSACTION. Также требуется явно сделанный оператор COMMIT или ROLLBACK в конце транзакции. Вложенные транзакции выходят за рамки этой темы.

Неявные транзакции немного отличаются от явных. Неявные транзакции не требуют четкости, определяющей транзакцию. Однако, как и для явных транзакций, они требуют указания оператора COMMIT или ROLLBACK.

Заключение

Явные транзакции являются наиболее идеальным решением - им требуется оператор COMMIT или ROLLBACK для завершения транзакции, и то, что происходит, четко указывается для чтения другими в случае необходимости. Неявные транзакции в порядке, если вы работаете с базой данных в интерактивном режиме, но операторы COMMIT следует указывать только после того, как результаты будут проверены и полностью определены как действительные.

Это означает, что вы должны использовать:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

... и используйте COMMIT;, только если результаты верны.

При этом операторы UPDATE и DELETE обычно возвращают только количество затронутых строк, а не конкретные детали. Преобразуйте такие операторы в операторы SELECT и просмотрите результаты, чтобы убедиться в правильности до попыток выполнения оператора UPDATE / DELETE.

Добавление

Операторы DDL (язык определения данных) автоматически фиксируются - им не требуется оператор COMMIT. IE: таблица, индекс, хранимая процедура, база данных и операторы создания или изменения представления.

17 голосов
/ 02 октября 2015

В InnoDB у вас есть START TRANSACTION;, который в этом движке является официально рекомендованным способом выполнения транзакций вместо SET AUTOCOMMIT = 0; (не используйте SET AUTOCOMMIT = 0; для транзакций в InnoDB , если только он не предназначен для оптимизации только для чтения транзакций). Совершить с COMMIT;.

Возможно, вы захотите использовать SET AUTOCOMMIT = 0; в InnoDB для целей тестирования, а не только для транзакций.

В MyISAM у вас нет START TRANSACTION;. В этом движке используйте SET AUTOCOMMIT = 0; для транзакций. Зафиксируйте с помощью COMMIT; или SET AUTOCOMMIT = 1; (Различие объяснено в примере комментария MyISAM ниже). Вы также можете делать транзакции в InnoDB.

Источник: http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit

Примеры транзакций общего пользования:

/* InnoDB */
START TRANSACTION;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */

/* MyISAM */
SET AUTOCOMMIT = 0;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

SET AUTOCOMMIT = 1; /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */
2 голосов
/ 01 июня 2010

Если вы хотите использовать откат, то используйте Запустите транзакцию и в противном случае забудьте все эти вещи, так как MySQL по умолчанию устанавливает autocommit в 1.

...