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