備忘録的プログラミングリファレンス

COMMIT クエリ

 COMMIT クエリはトランザクション操作を制御するためのコマンドで、入力や更新、削除されたデータの保存を確定します。

 COMMIT クエリは任意に実行することもできますが、通常は自動で実行されます。どのようなタイミングで実行されるかはデータベースによります。

COMMIT クエリ
COMMIT;

 マルチユーザーの環境ではデータの変更は COMMIT が実行されない限りは反映されません。すべてのユーザーにデータの変更が反映されには COMMIT が自動で実行されるのを待つ必要があります。
 任意に COMMIT を実行する方法もありますが、ほとんどのデータベースでは COMMIT は自動でオンの状態になっており、そのままでは COMMIT をリクエストできません。

 任意に COMMIT を実行するには、START TRANSACTION または BEGIN の宣言を使用します。
 START TRANSACTION または BEGIN はファンクションやプロシージャで使用することができ、ファンクションやプロシージャ内で COMMIT を実行するようにできます。
 データの入力や更新のファンクションで COMMIT を実行するようにすれば即時にそのことが反映されます。ただし、変更した内容は記録され元には戻せません。

 COMMIT に関連したクエリに ROLLBACK があります。 ROLLBACK は入力や更新されたデータを保存しないようにするようにできます。

COMMIT とは

 COMMIT とはトランザクション操作を制御するためのコマンドで、入力や更新、削除されたデータの即時に保存します。

 トランザくジョン処理において変更されたデータが保存( COMMIT )されるまではデータを変更したユーザーの操作が終わるまで待ちになります。
 マルチユーザー環境では COMMIT が実行されるまですべてのユーザーがデータの変更があったことを知ることができません。そのためにマルチユーザー環境では重複した同じデータを変更を行う可能性があります。
 COMMIT はマルチユーザー環境で重複したデータ変更が起こらないようすることができます。

COMMIT クエリ
COMMIT;

 データベースにおけるトランザクションとは、クエリのリクエスト〜データ保存までの一連の処理のことをいいます。
 例えば INSERTUPDATEDELETE クエリのリクエストは以下のようなトランザクション処理が行われます。

トランザクション
INSERT、UPDATE、DELETE クエリのリクエスト
⇓
データベースに接続
⇓
クエリの実行
⇓
データの変更
⇓
COMMIT または ROLLBACK
⇓
変更されたデータの保存

 COMMIT または ROLLBACK は変更されたデータの保存を確定するか/キャンセルするかのクエリです。
 COMMIT はデータの保存をただちに行い変更内容がすぐに反映されます。ROLLBACK は保存をキャンセルすることでデータの変更は反映されません。

 データベースの多くが自動で COMMIT が実行されます。ただし、ユーザーの操作が終わるまで変更されたデータの保存は待ちになります。
 スタンドアロン環境ではデータの変更は即時に反映されるために分かり難いです。

 自動 COMMIT がオンの状態で COMMIT を任意に機能させるには、START TRANSACTION または BEGIN を宣言します。

 自動 COMMIT がオンであるかは、 MySQL では autocommit プロパティ を、PostgreSQL では AUTOCOMMIT プロパティで確認できます。

MySQL 自動 COMMIT の確認
mysql> SELECT @@autocommit;
PostgreSQL 自動 COMMIT の確認
=> \echo :AUTOCOMMIT

自動 COMMIT の設定

 自動 COMMIT は一時的にオフにすることができます。オン/オフの方法はデータベースによって違いがあります。

MySQL

 自動 COMMIT をオフにするには、MySQL では autocommit の設定を 0 にします。

MySQL 自動 COMMIT のオフ
mysql> SET autocommit=0;

 自動 COMMIT をオンにするには、autocommit の設定を 1 に設定します。

MySQL 自動 COMMIT のオン
mysql> SET autocommit=1;

PostgreSQL

 PostgreSQL において自動 COMMIT をオフにするには、AUTOCOMMIT の設定を off にします。

PostgreSQL 自動 COMMIT のオフ
=> \set AUTOCOMMIT off

 自動 COMMIT をオンにするには、autocommit の設定を on に設定します。

PostgreSQL 自動 COMMIT のオン
=> \set AUTOCOMMIT on

 自動 COMMIT がオンの状態で任意に COMMIT を機能させるには、START TRANSACTION または BEGIN を宣言します。

START TRANSACTION

 START TRANSACTION は一連のトランザクション処理として始めることを宣言します。このコマンドは BEGIN と同じです。
 処理の途中でSET autocommit=0;または\set AUTOCOMMIT offを実行することで自動 COMMIT を一時的に停止することができます。
 自動 COMMIT がオフの状態なら COMMIT を任意に使用することができます。ただし、データの変更内容をキャンセルするためには ROLLBACK を実行します。

START TRANSACTION ( MySQL )
mysql> START TRANSACTION;

mysql> SELECT @@autocommit;

+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)
/* 自動 COMMIT はオン */

/* 自動 COMMIT はオフに */
mysql> SET autocommit=0;

/* データを更新してみる */
mysql> UPDATE goods SET name = 'sweets' WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

SELECT * FROM goods WHERE id = 1;
+----+--------+------------+
| id | name   | unit_price |
+----+--------+------------+
|  1 | sweets |          3 |
+----+--------+------------+

/* ROLLBACK してみる */
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

/* ROLLBACK が機能しているかを確認 */
mysql> SELECT * FROM goods WHERE id = 1;
+----+-------+------------+
| id | name  | unit_price |
+----+-------+------------+
|  1 | candy |          3 |
+----+-------+------------+
1 row in set (0.00 sec)

COMMIT;
Query OK, 0 rows affected (0.00 sec)

 最終的には COMMIT によって元通りのデータの状態で保存しています。

 COMMIT の効果に関してはこのようなスタンドアロンの環境では分かり難いのですが、マルチユーザーで1つのデータベースを利用している場合では COMMIT されない限りはすべてのユーザーにデータの変更は反映されません。