Подтвердить что ты не робот

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

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

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

По умолчанию режим autocommit включен в 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; выполняет эквивалент неявного добавления a SET autocommit=0; после COMMIT; или ROLLBACK;

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

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

4b9b3361

Ответ 1

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

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

Обычно отдельные транзакции DML (Insert, Update, Delete) выполняются в транзакции autocommit - они фиксируются, как только оператор успешно завершается. Это означает, что нет возможности откатить базу данных до состояния до того, как оператор был запущен в таких случаях, как ваш. Когда что-то пойдет не так, единственной возможностью восстановления является восстановление данных из резервной копии (при условии, что она существует). В 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 (Data Definition Language) автоматически фиксируются - они не требуют инструкции COMMIT. IE: инструкции таблицы, индекса, хранимой процедуры, базы данных и представления или изменения.

Ответ 2

В 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 */

Ответ 3

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