更新日:
システム開発において、データベースの整合性を保つための強力な仕組みをトランザクション制御と呼びます。この概念を理解するのは少々難易度が高く、SQLをかじった程度では全体像を掴みにくいと感じるかもしれません。しかし、システム開発現場における優先度は極めて高く、特に「排他制御」の観点から外せない要素。そのため、本章でしっかりおさえておきましょう。
トランザクション制御
トランザクションとは、データの確定から次のデータ確定までの期間を指す言葉。データが確定している状態とは、一言でいえば「誰が見ても同じ状態」であることです。
DML(データ操作)文を発行すると、テーブル内のデータは書き換わります。しかし、実はこの時点ではまだデータは確定していません。変更を行った本人にしか見えない状態。では、他のメンバーにも見えるように変更を反映させたいときはどうするか。ここでDCL(データ制御)文の出番というわけです。
- COMMIT:更新の確定
- ROLLBACK:更新の取消
- SAVEPOINT:セーブポイントの設定
このCOMMITを使用すると、自分の行った変更が他の人も閲覧できるように確定されます。逆にROLLBACKを実行すると、周囲の目に触れる前に自分の変更を取り消すことができます。そしてSAVEPOINTは、ロールバックを実行して元の状態に戻す位置を指定するために利用します。
トランザクションの動きはシンプル。要するに変更を行った際には、最後に必ずCOMMITを実行しなければならない、ということです。
一つのトランザクションが終了すれば、次のトランザクションが即座にスタートします。その時点で確定されているデータは、すぐに閲覧や操作が可能です。これによってデータの整合性が保たれ、誰がテーブル内を変更していても同じ最新の状態を閲覧できる。この仕組みを「読み取り一貫性」と呼びます。
ここで具体的な処理の流れを確認しましょう。以下にトランザクションを実行するSQLの一例を示します。データが確定(COMMIT)してから、次の確定を迎えるまでの処理範囲を視覚的に整理することが理解への近道です。処理の途中でエラーが起きた状況を想定し、セーブポイントを活用した制御の流れを追っていきます。
ここでは、システム開発現場でよくある連続的なデータ操作のシミュレーションとして、従業員データを更新する手順を例に挙げました。手順のナンバリングに沿って確認してください。
上記のSQLを発行した際、データベース内部でどのようなトランザクション管理が行われているのか、時系列に沿って一覧表にまとめました。処理が巻き戻る位置に注目してください。
| 処理順序 | 実行コマンド / 操作内容 |
|---|---|
| 1 | COMMIT (トランザクション開始) |
| 2 | DML (データ操作の実行) |
| 3 | SAVEPOINT A (地点設定) |
| 4 | DML (データ操作の実行) |
| 5 | SAVEPOINT B (地点設定) |
| 6 | DML (データ操作の実行) |
| 7 | ROLLBACK TO A (Aまで戻る) |
| 8 | DML (データ操作の実行) |
| 9 | COMMIT (全処理の確定) |
セーブポイントを打っておけば、万が一その後のDML操作でミスが発生しても、特定のポイントまでピンポイントでデータを巻き戻せます。システム開発現場を円滑に進める上で外せないテクニック。全体の処理がすべて成功して初めて、最後のCOMMITによってひとつの大きなトランザクションが完了となります。この一連の流れを意識して、安全なデータ操作を心がけましょう。
(参考)暗黙のコミット
DML文では、明示的にCOMMITを実行しない限りデータは確定しませんが、DDL(データ定義)文では、COMMITを発行しなくとも暗黙的にデータが確定されます。これを「暗黙のコミット」と呼びます。

