InnoDB
では、すべてのユーザーアクティビティーがトランザクション内部で発生します。 autocommit
モードが有効な場合、各 SQL ステートメントは単独で単一のトランザクションを形成します。 デフォルトでは、MySQL は、autocommit
が有効になっている新しい接続ごとにセッションを開始するため、MySQL は、SQL ステートメントがエラーを戻さなかった場合に、各 SQL ステートメントの後にコミットを実行します。 ステートメントからエラーが返された場合、コミットまたはロールバックの動作はそのエラーによって異なります。 セクション15.21.4「InnoDB のエラー処理」を参照してください。
autocommit
が有効になっているセッションは、明示的な START TRANSACTION
ステートメントまたは BEGIN
ステートメントで開始し、COMMIT
ステートメントまたは ROLLBACK
ステートメントで終了することで、複数ステートメントのトランザクションを実行できます。 セクション13.3.1「START TRANSACTION、COMMIT および ROLLBACK ステートメント」を参照してください。
SET autocommit = 0
とのセッション内で autocommit
モードが無効になっている場合、セッションでは常にトランザクションがオープンされています。 COMMIT
または ROLLBACK
ステートメントは現在のトランザクションを終了し、新しいセッションを開始します。
autocommit
が無効になっているセッションが、最終トランザクションを明示的にコミットせずに終了した場合、MySQL はそのトランザクションをロールバックします。
一部のステートメントは、ユーザーがそのステートメントの実行前に COMMIT
を実行した場合と同様に、暗黙的にトランザクションを終了します。 詳細は、セクション13.3.3「暗黙的なコミットを発生させるステートメント」を参照してください。
COMMIT
は、現在のトランザクション内で行われた変更は永続的であり、その他のセッションから表示できることを意味します。 反対に、ROLLBACK
ステートメントは、現在のトランザクションによって行われたすべての変更を取り消します。 COMMIT
と ROLLBACK
は両方とも、現在のトランザクション中に設定されたすべての InnoDB
ロックを解除します。
デフォルトでは、MySQL サーバーへの接続は、自動コミットモードが有効になっている状態で開始されるため、SQL ステートメントは実行するたびに自動的にコミットされます。 一連の DML ステートメントを発行し、すべてまとめてコミットまたはロールバックすることが標準操作となっているほかのデータベースシステムの使用経験がある場合は、この操作モードに馴染みがないかもしれません。
複数ステートメントのトランザクションを使用するには、SQL ステートメント SET autocommit = 0
を使用して自動コミットをオフにして、必要に応じて COMMIT
または ROLLBACK
を使用して各トランザクションを終了します。 自動コミットをオンのままにするには、START TRANSACTION
を使用して各トランザクションを開始し、COMMIT
または ROLLBACK
を使用して終了します。 次の例は 2 つのトランザクションを表しています。 1 番目はコミットされ、2 番目はロールバックされています。
shell> 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>
クライアント側言語でのトランザクション
PHP、Perl DBI、JDBC、ODBC などの API または MySQL の標準 C 呼び出しインタフェースでは、COMMIT
などのトランザクション制御ステートメントを SELECT
や INSERT
などのその他の SQL ステートメントと同様の文字列として、MySQL サーバーに送信できます。 一部の API では、別個の特別なトランザクションコミットおよびロールバックの関数やメソッドも提供されています。