説明
このステートメントは、トランザクションを開始するために使用されます。
データベーストランザクション(Database Transaction)とは、単一の論理的な作業単位として実行される一連の操作を指します。トランザクション処理は、データベースの整合性を維持し、一括されたSQL操作がすべて実行されるか、または全く実行されないことを保証するために使用できます。
明示的なトランザクションとは、ユーザーが定義または指定したトランザクションです。BEGIN および BEGIN WORK(BEGIN と BEGIN WORK は START TRANSACTION のエイリアスとして使用されます)ステートメントで明示的に開始し、COMMIT または ROLLBACK ステートメントで明示的に終了します。
説明
- トランザクションを
COMMITする前に、SELECTステートメントを1つ実行することで、そのトランザクション内の操作が既に有効になっているかどうかを確認できます。 - トランザクションを
COMMITする前は、現在のトランザクションセッション以外のセッションからは、そのトランザクション内の操作を見ることができません。つまり、トランザクションをCOMMITする前は、最新の結果はそのトランザクションのセッションでのアクセス時にのみ読み取れ、そのトランザクションのセッション外からのアクセスでは最新の結果は表示されません。 - そのトランザクションをロールバックしたい場合は、
COMMITの代わりにROLLBACKを直接使用します。
構文
{
| START TRANSACTION [READ ONLY | READ WRITE]
| BEGIN [WORK]
| COMMIT [WORK]
| ROLLBACK [WORK]
| SET TRANSACTION {READ ONLY | READ WRITE}
}
パラメータの説明
| パラメータ | 説明 | |------------|---------| | START TRANSACTION [READ ONLY | READ WRITE] | トランザクション開始ステートメント。一度トランザクションを開始すると、その後のSQLデータ操作ステートメント(INSERT、UPDATE、DELETE など)は、明示的にコミットするまで有効になりません。
- READ ONLY:読み取り専用モードでトランザクションを開始します。トランザクション内では変更操作の実行を許可しません。
- READ WRITE:読み書きモードでトランザクションを開始します(デフォルトモード)。 | | BEGIN | BEGIN と BEGIN WORK は START TRANSACTION のエイリアスです | | COMMIT | 現在のトランザクションをコミットします | | ROLLBACK | 現在のトランザクションをロールバックします | | SET TRANSACTION {READ ONLY | READ WRITE} | 現在のトランザクションを READ ONLY または READ WRITE モードに設定します |
例
このセクションでは、トランザクション関連ステートメントの使用例を示します。
サンプルテーブル
employeesを作成し、データを挿入します:obclient> CREATE TABLE employees ( emp_id INT, emp_name VARCHAR(10), salary INT ); obclient> INSERT INTO employees VALUES (1, 'Alice', 5000), (2, 'Bob', 6000), (3, 'Charlie', 4500);初期データを確認します:
obclient> SELECT * FROM employees;結果:
+--------+---------+--------+ | EMP_ID | EMP_NAME| SALARY | +--------+---------+--------+ | 1 | Alice | 5000 | | 2 | Bob | 6000 | | 3 | Charlie | 4500 | +--------+---------+--------+トランザクションのコミット例:トランザクションを開始し、従業員情報を更新して新しい従業員を追加します。
obclient> START TRANSACTION; obclient> UPDATE employees SET emp_name = 'Charles' WHERE emp_id = 3; obclient> INSERT INTO employees VALUES (4, 'David', 5500); obclient> COMMIT;更新後のデータを確認します:
obclient> SELECT * FROM employees;結果:
+--------+---------+--------+ | EMP_ID | EMP_NAME| SALARY | +--------+---------+--------+ | 1 | Alice | 5000 | | 2 | Bob | 6000 | | 3 | Charles | 4500 | | 4 | David | 5500 | +--------+---------+--------+トランザクションのロールバック例:トランザクションを開始し、変更後にロールバックします。
obclient> BEGIN; obclient> UPDATE employees SET emp_name = 'Eve' WHERE emp_id = 3; obclient> INSERT INTO employees VALUES (5, 'Frank', 7000); -- トランザクション中の変更を確認する obclient> SELECT * FROM employees;結果:
+--------+---------+--------+ | EMP_ID | EMP_NAME| SALARY | +--------+---------+--------+ | 1 | Alice | 5000 | | 2 | Bob | 6000 | | 3 | Eve | 4500 | | 4 | David | 5500 | | 5 | Frank | 7000 | +--------+---------+--------+ロールバックを実行します:
obclient> ROLLBACK;ロールバック後のデータを確認します:
obclient> SELECT * FROM employees;結果:
+--------+---------+--------+ | EMP_ID | EMP_NAME| SALARY | +--------+---------+--------+ | 1 | Alice | 5000 | | 2 | Bob | 6000 | | 3 | Charles | 4500 | | 4 | David | 5500 | +--------+---------+--------+