説明
このステートメントは、トランザクションを開始するために使用されます。
データベーストランザクション(Database Transaction)とは、単一の論理的な作業ユニットとして実行される一連の操作を指します。トランザクション処理は、データベースの整合性を維持し、一括されたSQL操作がすべて実行されるか、またはすべて実行されないかを保証するために使用できます。
明示的なトランザクションとは、ユーザーが定義または指定したトランザクションのことです。BEGIN および BEGIN WORK (BEGIN と BEGIN WORK は START TRANSACTION のエイリアスとして使用されます) ステートメントで明示的に開始され、COMMIT または ROLLBACK ステートメントで明示的に終了されます。
説明
- トランザクションが
COMMITされるまで、SELECTステートメントを実行して、このトランザクション内の操作がすでに有効になっているかどうかを確認できます。 - トランザクションが
COMMITされるまで、現在のトランザクションセッション以外のセッションは、このトランザクション内の操作を見ることができません。つまり、トランザクションがCOMMITされるまで、このトランザクションセッションのアクセスのみが最新の結果を読み取ることができ、このトランザクションセッション以外のアクセスでは最新の結果を見ることができません。 - このトランザクションをロールバックする場合は、
COMMITの代わりにROOLBACKを直接使用します。
構文
{
| 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など)は、明示的にコミットされるまで有効になりません。
|
| 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 | +--------+---------+--------+