MySQL5.5 トランザクションとAUTO COMMITモードのメモ
MySQLはデフォルトで、1つのSQL文を実行した後すぐにコミットを行う。このモードのことをAUTO COMMITモードと呼び、
デフォルトで「1」が設定されており、有効になっている。
★AUTO COMMITモードの確認
mysql> SELECT @@autocommit; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec) mysql>
AUTO COMMITモードが有効になっている状態でトランザクションを開始する際は、BEGIN文もしくはSTART TRANSACTION文が必要になる。
トランザクションの終了は、COMMIT文かROLLBACK文を実行する。
★トランザクションの確認(AUTO COMMITは「1」)
mysql> SELECT * FROM list WHERE id=1; +----+-----------+-------------+ | id | name | title | +----+-----------+-------------+ | 1 | Discharge | Never Again | +----+-----------+-------------+ 1 row in set (0.00 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE list SET name='Amy Winehouse', title='Back To Black' WHERE id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM list WHERE id=1; +----+---------------+---------------+ | id | name | title | +----+---------------+---------------+ | 1 | Amy Winehouse | Back To Black | +----+---------------+---------------+ 1 row in set (0.00 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM list WHERE id=1; +----+-----------+-------------+ | id | name | title | +----+-----------+-------------+ | 1 | Discharge | Never Again | +----+-----------+-------------+ 1 row in set (0.00 sec) mysql>
★AUTO COMMITモードを変更するには、SET AUTOCOMMIT文を実行する
mysql> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec)
AUTO COMMITモードが「0」のときは、BEGIN文またはSTART TRANSACTION文がなくても自動的にトランザクションが始まる。
COMMIT文またはROLLBACK文を実行すると、それまでのトランザクションが終了し自動的に次の新しいトランザクションが始まる。
★トランザクションの確認(AUTO COMMITは「0」)
mysql> SELECT @@autocommit; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM list; +----+------------+--------------+ | id | name | title | +----+------------+--------------+ | 1 | Discharge | Never Again | | 2 | Aphex Twin | Ambient Work | | 3 | Bjork | Debut | +----+------------+--------------+ 3 rows in set (0.00 sec) mysql> INSERT INTO list (name,title) VALUES ('Motorhead','Ace of Spades'); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM list; +----+------------+---------------+ | id | name | title | +----+------------+---------------+ | 1 | Discharge | Never Again | | 2 | Aphex Twin | Ambient Work | | 3 | Bjork | Debut | | 5 | Motorhead | Ace of Spades | +----+------------+---------------+ 4 rows in set (0.00 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM list; +----+------------+--------------+ | id | name | title | +----+------------+--------------+ | 1 | Discharge | Never Again | | 2 | Aphex Twin | Ambient Work | | 3 | Bjork | Debut | +----+------------+--------------+ 3 rows in set (0.00 sec) mysql>