In InnoDB
, all user activity occurs inside a
transaction. If autocommit
mode
is enabled, each SQL statement forms a single transaction on its
own. By default, MySQL starts the session for each new
connection with autocommit
enabled, so MySQL does a commit after each SQL statement if that
statement did not return an error. If a statement returns an
error, the commit or rollback behavior depends on the error. See
Section 17.21.5, “InnoDB Error Handling”.
A session that has autocommit
enabled can perform a multiple-statement transaction by starting
it with an explicit
START
TRANSACTION
or
BEGIN
statement and ending it with a
COMMIT
or
ROLLBACK
statement. See Section 15.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Statements”.
If autocommit
mode is disabled
within a session with SET autocommit = 0
, the
session always has a transaction open. A
COMMIT
or
ROLLBACK
statement ends the current transaction and a new one starts.
If a session that has
autocommit
disabled ends
without explicitly committing the final transaction, MySQL rolls
back that transaction.
Some statements implicitly end a transaction, as if you had done
a COMMIT
before executing the
statement. For details, see Section 15.3.3, “Statements That Cause an Implicit Commit”.
A COMMIT
means that the changes
made in the current transaction are made permanent and become
visible to other sessions. A
ROLLBACK
statement, on the other hand, cancels all modifications made by
the current transaction. Both
COMMIT
and
ROLLBACK
release all InnoDB
locks that were set during
the current transaction.
By default, connection to the MySQL server begins with autocommit mode enabled, which automatically commits every SQL statement as you execute it. This mode of operation might be unfamiliar if you have experience with other database systems, where it is standard practice to issue a sequence of DML statements and commit them or roll them back all together.
To use multiple-statement
transactions, switch
autocommit off with the SQL statement SET autocommit
= 0
and end each transaction with
COMMIT
or
ROLLBACK
as
appropriate. To leave autocommit on, begin each transaction
with START
TRANSACTION
and end it with
COMMIT
or
ROLLBACK
.
The following example shows two transactions. The first is
committed; the second is rolled back.
$> mysql test
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do a transaction with autocommit turned on.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (10, 'Heikki');
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do another transaction with autocommit turned off.
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (15, 'John');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO customer VALUES (20, 'Paul');
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM customer WHERE b = 'Heikki';
Query OK, 1 row affected (0.00 sec)
mysql> -- Now we undo those last 2 inserts and the delete.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM customer;
+------+--------+
| a | b |
+------+--------+
| 10 | Heikki |
+------+--------+
1 row in set (0.00 sec)
mysql>
Transactions in Client-Side Languages
In APIs such as PHP, Perl DBI, JDBC, ODBC, or the standard C
call interface of MySQL, you can send transaction control
statements such as COMMIT
to
the MySQL server as strings just like any other SQL statements
such as SELECT
or
INSERT
. Some APIs also offer
separate special transaction commit and rollback functions or
methods.