Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

15.7.2.2 自動コミット、コミットおよびロールバック

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 ステートメントは、現在のトランザクションによって行われたすべての変更を取り消します。 COMMITROLLBACK は両方とも、現在のトランザクション中に設定されたすべての InnoDB ロックを解除します。

トランザクションを使用した DML 操作のグループ化

デフォルトでは、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 などのトランザクション制御ステートメントを SELECTINSERT などのその他の SQL ステートメントと同様の文字列として、MySQL サーバーに送信できます。 一部の API では、別個の特別なトランザクションコミットおよびロールバックの関数やメソッドも提供されています。