同時実行制御 【concurrency control】
トランザクション処理は複数のデータ処理を一体不可分の単位として扱う実行方式で、実行の前後でデータに矛盾が無いことが要請される。実際のコンピュータシステムでは複数のトランザクションを同時に稼働させる必要があり、他のトランザクションの操作によって処理に矛盾を来さないよう適切に制御する必要がある。
原理的にまったく互いに干渉しないようにするにはトランザクションを並行に実行せず順番に実行する「直列化」(シリアライゼーション)を行えば良いが、性能が極端に下がり処理が進まなくなってしまうため現実に採用することは難しい。
そこで、アクセスしようとする資源(テーブルやレコードなど)を一時的に封鎖(ロック)して占有し、処理中は他のトランザクションのアクセスを禁じる「排他制御」が行われる。テーブル単位で行うか行単位で行うか、他のトランザクションの読み書きを完全に禁じるか読み込みは許可するのかなど、ロックの仕方には様々な種類がある。
トランザクション分離レベル
同時実行制御におけるトランザクションの並行性(高速性)と独立性(安全性)はトレードオフ(あちらを立てればこちらが立たず)の関係にあるため、それぞれをどの水準で両立(妥協)するのかについていくつかのレベル提唱されている。よく知られるSQL標準では4段階のトランザクション分離レベルを定義している。
最も安全だが性能が低いレベルが「SERIALIZABLE」で、直列化したのと同じように他のトランザクションの影響をまったく受けないよう制御する。次に安全なのが「REPEABLE READ」で、対象データを処理中に他のトランザクションが削除・更新するのを防ぐ。
3番目は「READ COMMITED」で、他のトランザクションでコミットされた値の変更の影響を受ける。最も分離レベルが低いのが「READ UNCOMMITED」で、他のトランザクションによる未コミットの変更の影響も受ける(が最も性能が高い)。