あるプログラムのトランザクションでエンタープライズ ジオデータベースのデータを更新し、トランザクションをコミットする前に、別のプログラムが同じデータを読み取ったとします。 2 つ目のプログラムは新しいコミットされていないデータを読み取るでしょうか、それとも、古いデータを読み取るでしょうか。 その答えは、トランザクションの分離性レベルによって異なります。
トランザクションがコミットされていないデータの読み取りを他のプログラムに許可する場合、2 つ目のプログラムは更新されたデータを読み取ります。 この場合、2 つ目のプログラムはトランザクションが完了するまでデータの読み取りを待つ必要がないので、パフォーマンスが向上する可能性があります。 しかし、これにはトレードオフがあります。2 つ目のプログラムが読み取るデータが最終的にコミットされない場合、2 つ目のプログラムは不正なデータまたは存在しないデータを読み取ることになります。
ユーザーがアプリケーションに最適なオプションを選択できるよう、DBMS は分離性レベルを提供します。分離性レベルは、後続のプロセスを他の同時実行プロセスからどのように分離するかを定義します。 分離性レベルはデータベース管理者が設定することができ、データベースのすべてのトランザクションに適用することができます。 分離性レベルは、アプリケーション内で、または個々のトランザクションを開始する前に設定することもできます。 分離性レベルにより、以下が決定されます。
- アプリケーションが読み取った、および更新した行が同時に実行している他のプロセスでどの程度利用できるようにするか
- 同時に実行している他のアプリケーション プロセスによる更新をアプリケーションがどの程度利用できるようにするか
DBMS では、4 つの分離性レベルのいずれかを設定することができます。 次に、分離性の低いものから順にそれらを示します。 高い分離性レベルを設定した場合、データ整合性が強化されますが、ロックを保持する期間が長くなるため、同時実行性は低下します。
UNCOMMITTED READ: この分離性レベルでは、同時に実行されているトランザクション間の分離性が最も低くなります。 並行するトランザクションで更新されたデータを、コミット前でも他のトランザクションが読み込んでしまうことがあります。
COMMITTED READ: トランザクションはコミットされたデータのみを読み取ります。コミットされていないデータを読み取ることはありません。
REPEATABLE READ: トランザクション内で同じ行が繰り返し読み取られた場合に適用される制限を追加します。 これにより、同じ行が連続的に読み取られた場合に、その行の値が同じであることを保証します。
SERIALIZABLE: この分離性レベルでは、同時に実行されているトランザクション間の分離性が最も高くなります。 トランザクション内の読み込みはすべて、トランザクション開始前にコミット済みのデータのみを対象とします。コミットしたのがトランザクション実行中であれば、その更新の影響は受けません。
DBMS によって、これらの分離性レベルの名前が異なる場合があります。 どの分離性レベルも同様に機能しますが、重要な違いがいくつかあります。 アプリケーションとワークフローを正しく設計するためには、DBMS のロックと同時実行性に分離性レベルがどのように影響するのかを理解しなければなりません。 詳細については、DBMS のドキュメントをご参照ください。
ArcGIS に分離性レベルが適用される仕組みと同時実行性問題の詳細については、「同時実行性とロック」をご参照ください。