Search the MySQL manual:
MySQL Manual

Buy this Reference Manual in softcover from Barnes & Noble!

/ / Up / Table of Contents

6.7.1 Синтаксис команд BEGIN/COMMIT/ROLLBACK

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

При использовании таблиц, поддерживающих транзакции (таких как InnoDB, BDB), в MySQL можно отключить режим autocommit при помощи следующей команды:

SET AUTOCOMMIT=0

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

Если необходимо переключиться из режима AUTOCOMMIT только для выполнения одной последовательности команд, то для этого можно использовать команду BEGIN или BEGIN WORK:

BEGIN;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

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

При выполнении команды ROLLBACK после обновления таблицы, не поддерживающей транзакции, пользователь получит ошибку (ER_WARNING_NOT_COMPLETE_ROLLBACK) в виде предупреждения. Все таблицы, поддерживающие транзакции, будут перезаписаны, но ни одна таблица, не поддерживающая транзакции, не будет изменена.

При выполнении команд BEGIN или SET AUTOCOMMIT=0 необходимо использовать двоичный журнал MySQL для резервных копий вместо более старого журнала записи изменений. Транзакции сохраняются в двоичном системном журнале как одна порция данных (перед операцией COMMIT), чтобы гарантировать, что транзакции, по которым происходит откат, не записываются. See section 4.9.4 Бинарный журнал обновлений.

Следующие команды автоматически завершают транзакцию (как если бы перед выполнением данной команды была сделана операция COMMIT ):

Команда Команда Команда
ALTER TABLE BEGIN CREATE INDEX
DROP DATABASE DROP TABLE RENAME TABLE
TRUNCATE

Уровень изоляции для транзакций можно изменить с помощью команды SET TRANSACTION ISOLATION LEVEL .... See section 6.7.3 Синтаксис команды SET TRANSACTION.

User Comments

Posted by on Thursday December 19 2002, @3:31pm [Delete] [Edit]

the list of commands that automatically commits
an open transaction is missing "lock tables"

http://www.mysql.com/doc/en/LOCK_TABLES.html :
NOTE: LOCK TABLES is not transaction-safe and
will automatically commit any active
transactions before attempting to lock the
tables.

Posted by [name withheld] on Friday May 17 2002, @6:24am [Delete] [Edit]

The following commands automatically ends a
transaction : BEGIN

That would mean that MySQL does not
support "nested" transactions?

Posted by on Friday May 17 2002, @6:24am [Delete] [Edit]

If you have committed the transaction, you can't
use rollback and need to restore off backup tapes
to recover deleted records.

Posted by Rich Brome on Tuesday October 1 2002, @1:46pm [Delete] [Edit]

If you start a transaction with BEGIN, and it gets
interrupted unexpectedly (so a COMMIT is never
issued), shouldn't the default behavior be to
ROLLBACK when another major command is issued?
I would think that the whole point of transactions is
to make a process fail-safe. The current method
requires an explicit ROLLBACK, which seems to
defeat the purpose of transactions. If you start a
transaction with BEGIN, but it still auto-commits if
something goes wrong, how is that a transaction at
all? Or am I missing something huge and obvious?

Posted by Martin RЖsch on Monday February 10 2003, @1:48am [Delete] [Edit]

I have learned that is good practice to issue a ROLLBACK before the first transaction in your program.

Add your own comment.

Top / / / Up / Table of Contents