トランザクションとは?
トランザクション(Transaction)とは、データベースにおける一連の処理の単位です。たとえば「銀行口座の残高から引き落とす→記録する」という2つの処理は、途中で失敗しては困ります。このようにすべて成功するか、すべて失敗するかが求められるのがトランザクションです。
ACID特性(復習)
トランザクションには「ACID特性」と呼ばれる4つの重要な特性があります。
- A(Atomicity:原子性):すべての処理が成功するか、全く行われないか
- C(Consistency:一貫性):常に整合性のとれた状態になる
- I(Isolation:独立性):他のトランザクションの影響を受けない
- D(Durability:永続性):コミット後のデータは失われない
今回のテーマである2相ロックは、この中の「独立性(Isolation)」を確保するための仕組みです。
2相ロックとは?
2相ロック(Two-Phase Locking)は、トランザクションの実行中にデータの競合を防ぐためのロック制御方法です。
2相ロックの仕組み
2相ロックは、次の2つのフェーズで構成されます。
- ロック取得フェーズ:必要なデータに対してロックを取得する
- ロック解放フェーズ:トランザクションの終了時にまとめてロックを解除する
この方式により、**直列化可能性(Serializability)**が保証されます。つまり、複数のトランザクションを並列に実行しても、逐次(1つずつ)実行したのと同じ結果が得られるのです。
直列化可能とは?
「直列化可能」とは、複数のトランザクションを並列実行したとしても、実行結果が順番に1つずつ処理した場合と同じになることです。2相ロックを使用することで、これが保証されます。
2相ロックを使わないと?
2相ロックを使わずにトランザクションを並列実行すると、逐次実行と異なる結果になる可能性があります。たとえば、データの読み書きのタイミング次第で、更新が失われるなどの問題が起こるのです。
2相ロックの落とし穴:デッドロック
便利な2相ロックですが、**「デッドロック」**という問題が発生することがあります。
デッドロックとは?
デッドロックとは、複数のトランザクションが互いにロック解除を待ち続ける状態です。たとえば、AがXをロックしてYを待ち、BがYをロックしてXを待つような状況です。
原因
- トランザクションが異なる順番でロックを取得することが原因です。
- 2相ロックの副作用とも言えます。
デッドロックの対策
- 2相ロックを使わない(ただし、直列化可能性は失われる)
- ロック取得の順序を統一する(シンプルで有効な手法)
隔離性レベルとは?
データベース管理システム(DBMS)では、「隔離性(Isolation)レベル」を設定できます。これは、トランザクション同士をどれだけ独立させるかの度合いを表します。
レベル | 説明 | 問題点 |
---|---|---|
READ UNCOMMITTED | 他トランザクションの未コミットデータも読める | ダーティリード発生 |
READ COMMITTED | コミット済みデータのみ読める | アンリピータブルリード発生 |
REPEATABLE READ | 読んだ値はトランザクション内で変わらない | ファントムリード発生 |
SERIALIZABLE | 完全に直列実行と同じ | 性能低下の可能性あり |
まとめ
キーワード | 解説 |
---|---|
2相ロック | ロック取得→解除を明確に分ける方式。直列化可能性を保証 |
デッドロック | ロックの順序によって発生。対策が必要 |
隔離性レベル | トランザクション間の独立性を制御する設定 |
コメント