Различие между НАБОРОМ autocommit=1 и ЗАПУСКАЕТ ТРАНЗАКЦИЮ в mysql (Я пропустил что-то?)

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

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

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

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

START TRANSACTION; будет в основном SET autocommit=0; до a 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 - видящий, поскольку наличие уровня изоляции подразумевает, что существует транзакция, означая, что автоматическая фиксация должна быть прочь так или иначе?

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

67
задан Peter Mortensen 10 March 2011 в 21:33
поделиться

2 ответа

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

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

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

SET autocommit = 0

Явная транзакция - это когда оператор (-ы) заключены в явно определенный блок кода транзакции - для MySQL, это НАЧАТЬ ТРАНЗАКЦИЮ .Также требуется явно сделанный оператор COMMIT или ROLLBACK в конце транзакции. Вложенные транзакции выходят за рамки этой темы.

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

Заключение

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

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

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

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

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

Дополнение

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

67
ответ дан 24 November 2019 в 14:43
поделиться

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

2
ответ дан 24 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: