HomeMySQL Page 6 - Using Transactions In MySQL (Part 1)
Rules of the Game - MySQL
One of the most-requested MySQL features - transactions - is finally available in MySQL 4.0. In this first segment of a two-part article, learn about the theory behind the transactional model, find out how it can make your SQL applications more robust, and find out how to implement a transactional environment with MySQL's InnoDB table handler.
It is important to note that MySQL does not permit nested transactions. As in the example below, if you start a new transaction without ending the previous one with a COMMIT or ROLLBACK, MySQL will automatically commit the previous transaction's data to disk before beginning a new transaction.
mysql> SELECT * FROM users; +----+------+------------------+ | id | name | pass | +----+------+------------------+ | 3 | alan | 5af23f026beddb81 | | 4 | john | 2ca0ede551581d29 | +----+------+------------------+ 2 rows in set (0.26 sec)
A number of other SQL commands also perform such an implicit COMMIT - dropping, creating and altering tables; dropping and creating indexes; and dropping and creating databases.
That said, it is interesting to note that if you begin a transaction, but exit the session before issuing a COMMIT or ROLLBACK, MySQL does *not* perform an automatic COMMIT; instead, it issues a ROLLBACK. The following example demonstrates:
[me@host]$ mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 5 to server version: 4.0.12-max-debug
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> SELECT * FROM users; +----+------+------------------+ | id | name | pass | +----+------+------------------+ | 3 | alan | 5af23f026beddb81 | | 4 | john | 2ca0ede551581d29 | +----+------+------------------+ 2 rows in set (0.00 sec)
Now, when you open a new session, and check the "users" table, you'll see that there is no record for Tim, since MySQL issued a ROLLBACK when the previous session exited.
[me@host]$ mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 6 to server version: 4.0.12-max-debug
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> USE master; Database changed
mysql> SELECT * FROM users; +----+------+------------------+ | id | name | pass | +----+------+------------------+ | 3 | alan | 5af23f026beddb81 | | 4 | john | 2ca0ede551581d29 | +----+------+------------------+ 2 rows in set (0.01 sec)
This is of particular relevance to the next example - so flip the page and let's see how.