同時実行制御

コンカレンシー とは、同じデータを同時に使用する 2 つのトランザクションの能力であり、トランザクションの分離が進むと、通常はコンカレンシーが低下します。 これは、通常、トランザクション分離は行をロックすることによって実装され、ロックされる行が増えるにつれて、ロックされた行によって少なくとも一時的にブロックされることなく完了できるトランザクションが少なくなるためです。 一般に、コンカレンシーの低下は、データベースの整合性を維持するために必要な高いトランザクション分離レベルのトレードオフとして受け入れられますが、カーソルを使用する読み取り/書き込みアクティビティが高い対話型アプリケーションでは問題になる可能性があります。

たとえば、アプリケーションが SQL ステートメント SELECT * FROM Orders を実行するとします。 SQLFetchScroll を呼び出して結果セットをスクロールし、ユーザーが注文を更新、削除、または挿入できるようにします。 ユーザーが注文を更新、削除、または挿入した後、アプリケーションはトランザクションをコミットします。

分離レベルが Repeatable Read の場合、トランザクションは、実装方法に応じて、SQLFetchScroll によって返される各行をロックする可能性があります。 分離レベルが Serializable の場合、トランザクションによって Orders テーブル全体がロックされる可能性があります。 どちらの場合も、トランザクションは、コミットまたはロールバックされたときにのみロックを解放します。 そのため、ユーザーが注文の読み取りに多くの時間を費やし、更新、削除、または挿入にほとんど時間を費やさなかった場合、トランザクションは多数の行を簡単にロックして、他のユーザーが使用できないようにすることができます。

これは、カーソルが読み取り専用で、アプリケーションでユーザーが既存の注文のみを読み取る場合でも問題になります。 この場合、アプリケーションは SQLCloseCursor (オート コミット モード) または SQLEndTran (手動コミット モード) を呼び出すと、トランザクションをコミットし、ロックを解放します。

このセクションでは、次のトピックを扱います。