トランザクション分離レベルの指定
トランザクションの管理 への移動
トランザクション分離レベルは、同時トランザクションが同じテーブルを操作する場合にそれらのトランザクション間で行われる相互作用の方式を決定するものです。特に、これは、あるトランザクションから、他のトランザクションによるテーブルへの変更がどれだけ "見えるか" に影響を及ぼします。
サポートされている可能なトランザクション分離レベルは、サーバーの種類ごとに異なります。可能なトランザクション分離レベルは次の 3 種類です。
- DirtyRead -- 分離レベルが DirtyRead の場合、トランザクションは他のトランザクションで行われたすべての変更を、それらの変更がまだコミットされていなくても読み取れます。コミットされていない変更は、恒久的なものではなく、いつでもロールバックされる可能性があります。この値の場合に実現される分離は最低限のもので、多くのデータベース サーバー(Oracle、Sybase、MSSQL、InterBase など)では使用できません。
- ReadCommitted -- 分離レベルが ReadCommitted の場合は、他のトランザクションで行われコミットされた変更だけを読み取れます。この設定の場合、ロールバックされる可能性があるコミットされていない変更をトランザクションが読み取るおそれはなくなりますが、読み取りの最中に別のトランザクションがコミットされると、読み取った変更内容がデータベースの実際の状態と矛盾する可能性は残ります。この分離レベルは、BDE で管理されるローカル トランザクションを除くすべてのトランザクションで使用可能です。
- RepeatableRead -- 分離レベルが RepeatableRead の場合、トランザクションで読み取るデータベース データの状態は必ず一貫性が保たれています。トランザクションで読み取るのは、データの 1 回のスナップショットだけです。それ以降に他の同時トランザクションによってデータが変更されても、このトランザクションでそれを読み取ることはできません(たとえ変更がコミットされても読み取れません)。この分離レベルでは、トランザクションがいったんレコードを読み取ると、そのレコードのビューは変化しないことが保証されます。このレベルでは、トランザクションは、他のトランザクションで行われる変更から最も隔離されます(最も高い分離レベルです)。このレベルは、一部のサーバー(Sybase や MSSQL など)では使用できず、BDE で管理されるローカル トランザクションでも使用できません。
さらに、TSQLConnection では、データベース固有のカスタム分離レベルも指定できます。カスタム分離レベルは dbExpress ドライバで定義されます。詳細については、ドライバのドキュメントを参照してください。
メモ: それぞれの分離レベルがどう実装されているかについて、詳しくは、お使いのサーバーのドキュメントを参照してください。
TDatabase と TADOConnection では、TransIsolation プロパティを設定することにより、トランザクション分離レベルを指定できます。TransIsolation を、データベース サーバーでサポートされていない値に設定すると、2 番目に高い分離レベルになります(それが使用可能であれば)。より高い使用可能なレベルがない場合は、トランザクションを開始しようとすると、接続コンポーネントで例外が発生します。
TSQLConnection を使用する場合、トランザクション分離レベルはトランザクション記述子の IsolationLevel フィールドで制御されます。
InterBase Express を使用する場合、トランザクション分離レベルはトランザクション パラメータで制御されます。