PSQL Programmer's Guide (v11)

受動的並行性(パッシブ コンカレンシー) (トランザクショナル インターフェイス)

アプリケーションが、トランザクション モード外または並行トランザクション内から単一レコードの読み取り操作および更新操作を実行する場合は、受動的並行性に依存して更新の競合を解決することができます。受動的並行性は MicroKernel によって自動的に適用されるものであり、アプリケーションまたはユーザーからの明示的な指示を必要としません。

受動的並行性の状態にある場合、MicroKernel はクライアントが操作にロック バイアスを適用しなくてもレコードを読み取れるようにします。最初のクライアントがレコードを読み取ってから、そのレコードの更新または削除を試みるまでの間に、2 番目のクライアントがそのレコードを変更した場合、MicroKernel はステータス コード 80 を返します。この場合、最初のクライアントが行う変更は、レコードの古いイメージに基づいています。そのため、最初のクライアントは更新または削除操作を実行する前に、レコードを再度読み取る必要があります。

受動的並行性により、開発者はわずかな変更だけでシングルユーザー環境からマルチユーザー環境へアプリケーションを直接移動できます。

35 と表 36 は、受動的並行性を使用している場合に 2 つのクライアントがどのように相互作用するかを示しています。トランザクションでない場合と並行トランザクションからの場合を示します。

表 35 受動的並行性(トランザクションでない処理の例)
クライアント 1
クライアント 2
1. ファイルを開きます。
 
 
2. ファイルを開きます。
3. レコード A を読み取ります。
 
 
4. レコード A を読み取ります。
5. レコード A を更新します。
 
 
6. レコード A を更新します。MicroKernel は、ステータス コード 80 を返します。
 
7. レコード A を再度読み取ります。
 
8. レコード A を更新します。

表 36 受動的並行性(並行トランザクションの例)
クライアント 1
クライアント 2
1. 並行トランザクションを開始します。
 
 
2. 並行トランザクションを開始します。
3. レコード A を読み取ります。
 
4. レコード A を更新します。
 
 
5. レコード A を読み取ります。
6. トランザクションを終了します。
 
 
7. レコード A を更新します。MicroKernel は、競合ステータス コードを返します。
 
8. レコード A を再度読み取ります。
 
9. レコード A を更新します。
 
10. トランザクションを終了します。


メモ

クライアント 1 がレコード A の更新操作を既に実行した後でクライアント 2 がレコード A を読み取ったとしても、MicroKernel は手順 7 で競合エラーを正しく検出します。この競合が存在するのは、クライアント 1 が手順 6 でトランザクションを終了するまでレコード A に対して行った変更をコミットしないからです。クライアント 2 が手順 7 で更新を実行するときまでに、手順 5 で読み取ったレコード A のイメージは古くなってしまいます。



Btrieve クライアント (トランザクショナル インターフェイス)

レコードのロック (トランザクショナル インターフェイス)