Наше приложение запускает запрос INSERT к базе данных MySQL для добавления записей. Я хочу знать, автоматически ли фиксируются записи. Если я запускаю команду ROLLBACK, когда база данных выполняет откат? Возможен ли ROLLBACK после COMMIT?
Наше приложение запускает запрос INSERT к базе данных MySQL для добавления записей. Я хочу знать, автоматически ли фиксируются записи. Если я запускаю команду ROLLBACK, когда база данных выполняет откат? Возможен ли ROLLBACK после COMMIT?
Ответы:
Ответ на ваш вопрос зависит от того, участвуете ли вы в транзакции, которая будет охватывать более одного утверждения. (Вы пометили вопрос с InnoDB, ответ был бы другим с MyISAM.)
Из справочного руководства: http://dev.mysql.com/doc/refman/5.1/en/commit.html
По умолчанию MySQL работает с включенным режимом автоматической фиксации. Это означает, что как только вы выполняете инструкцию, которая обновляет (модифицирует) таблицу, MySQL сохраняет обновление на диске, чтобы сделать его постоянным.
Так что да, по умолчанию, если вы просто используете INSERT
, вставленные вами записи будут зафиксированы, и нет смысла откатывать их назад. (Это фактически то же самое, что оборачивать каждое утверждение между BEGIN
и COMMIT
.)
Однако, если вы имеете дело с транзакциями в явном виде, вам придется использовать COMMIT
для фиксации хранения записей, но вы также сможете использовать ROLLBACK
.
Вы можете начать транзакцию явно с помощью START TRANSACTION
(или BEGIN
). Это не зависит от autocommit
настройки (по умолчанию включено):
При START TRANSACTION автокоммит остается отключенным, пока вы не завершите транзакцию с помощью COMMIT или ROLLBACK. Затем режим автоматической фиксации возвращается в прежнее состояние.
В качестве альтернативы, если autocommit=0
, я думаю, какое-либо утверждение, следующее за другим концом транзакции, начнет транзакцию (но вы все равно можете использовать START TRANSACTION
явно); что , по крайней мере, как я интерпретировать это :
Режим автоматической фиксации. Если установлено значение 1, все изменения в таблице вступают в силу немедленно. Если установлено значение 0, вы должны использовать COMMIT для принятия транзакции или ROLLBACK для ее отмены. Если autocommit равен 0 и вы измените его на 1, MySQL автоматически выполнит COMMIT любой открытой транзакции. Другой способ начать транзакцию - использовать оператор START TRANSACTION или BEGIN. См. Раздел 12.3.1, «Синтаксис START TRANSACTION, COMMIT и ROLLBACK».
Более конкретно, «другой способ начать транзакцию», по-видимому, подразумевает, что установки «autocommit = 0» достаточно для запуска транзакции (по крайней мере, непосредственно перед каждым оператором в начале сеанса или после COMMIT
/ ROLLBACK
). Я бы предложил использовать BEGIN
или START TRANSACTION
явно в любом случае, даже если autocommit=0
, поскольку это может сделать его более понятным, чтобы увидеть, когда транзакция начинается или заканчивается.
(Способ запуска транзакции может зависеть от того, как ваше приложение использует MySQL.)
По умолчанию для InnoDB установлено значение autocommit = 1 или ON . После совершения они не могут быть отменены .
Вам нужно будет сделать одну из двух вещей, чтобы отключить его в будущем:
ВАРИАНТ 1: Добавьте это в /etc/my.cnf и перезапустите mysql
[mysqld]
autocommit=0
ВАРИАНТ 2: Выполните одно из этих действий в открытом подключении к БД перед началом любого значимого SQL
SET autocommit = 0;
START TRANSACTION;
Под этими двумя вариантами вам придется выполнить ручной COMMIT или ручной ROLLBACK .
ПРЕДОСТЕРЕЖЕНИЕ
Если таблица MyISAM, то объяснение проще. Поскольку для механизма хранения MyISAM нет транзакций, все выполняемые операции INSERT, UPDATE и DELETE являются постоянными. Никаких откатов вообще.