JetEscrowUpdate 関数
適用対象: Windows |Windows Server
JetEscrowUpdate 関数
JetEscrowUpdate 関数は、1 つの列に対してアトミック加算操作を実行します。 この関数を使用すると、複数のセッションで競合することなく、同じレコードを同時に更新できます。
JET_ERR JET_API JetEscrowUpdate(
__in JET_SESID sesid,
__in JET_TABLEID tableid,
__in JET_COLUMNID columnid,
__in void* pv,
__in unsigned long cbMax,
__out_opt void* pvOld,
__in unsigned long cbOldMax,
__out_opt unsigned long* pcbOldActual,
__in JET_GRBIT grbit
);
パラメーター
sesid
この呼び出しに使用するセッション。
tableid
この呼び出しに使用するカーソル。
columnid
更新する列の columnid 。
pv
列の addend を含むバッファーへのポインター。
cbMax
addend を含むバッファーのサイズ。
pvOld
データベースに格納されている列の現在の値を受け取る出力バッファー (バージョン管理は無視されます)。
cbOldMax
列の現在の値を受け取る出力バッファーの最大サイズ。 現在、JET_coltypLongのみがサポートされているため、バッファーの長さは 4 バイトまたは 0 バイトである必要があります。 pvOld が NULL の場合、cbOldMax は 0 である必要があります。
pcbOldActual
出力バッファーで受信した生の値データの実際の量を受け取ります。
grbit
次のオプションの 0 個以上を指定するビットのグループ。
値 |
説明 |
---|---|
JET_bitEscrowNoRollback |
エスクロー更新を実行するセッションにトランザクションロールバックがある場合でも、この更新は元に戻されません。 ログ レコードがディスクにフラッシュされない可能性があるため、クラッシュが発生すると、このフラグで行われた最近のエスクロー更新が失われる可能性があることに注意してください。 |
戻り値
この関数は、次のいずれかのリターン コードを使用して 、JET_ERR データ型を返します。 考えられる ESE エラーの詳細については、「 拡張可能ストレージ エンジン エラー 」および「 エラー処理パラメーター」を参照してください。
リターン コード |
説明 |
---|---|
JET_errSuccess |
操作は正常に完了しました。 |
JET_errAlreadyPrepared |
カーソルには、 JetPrepareUpdate で準備された更新プログラムがあります。 |
JET_errClientRequestToStopJetService |
JetStopService の呼び出しの結果、セッションに関連付けられたインスタンス上のすべてのアクティビティが停止したため、操作を完了することはできません。 |
JET_errInstanceUnavailable |
セッションに関連付けられているインスタンスで致命的なエラーが発生したため、操作を完了できません。このエラーでは、そのデータの整合性を保護するためにすべてのデータへのアクセスを取り消す必要があります。 このエラーは、Windows XP 以降のリリースでのみ返されます。 |
JET_errInvalidBufferSize |
無効なバッファー サイズが渡されました。 現在、JET_coltypLongのみがサポートされているため、バッファーは 4 バイトである必要があります。 |
JET_errInvalidOperation |
無効な列が指定されました。 列は、JET_bitColumnEscrowUpdate指定して作成する必要があります。 JET_coltypLongの固定列のみをエスクロー更新可能として指定できます。 |
JET_errNoCurrentRecord |
列を更新するには、レコードにカーソルを置く必要があります。 |
JET_errNotInTransaction |
エスクロー更新は、トランザクション内のセッションによってのみ実行できます。 |
JET_errNotInitialized |
セッションに関連付けられているインスタンスがまだ初期化されていないため、操作を完了できません。 |
JET_errPermissionDenied |
カーソルを読み取り専用にして、レコードを更新することはできません。 |
JET_errRestoreInProgress |
セッションに関連付けられているインスタンスで復元操作が進行中であるため、操作を完了できません。 |
JET_errSessionSharingViolation |
同じセッションを複数のスレッドから同時に使用することはできません。 このエラーは、Windows XP 以降のリリースでのみ返されます。 |
JET_errTermInProgress |
セッションに関連付けられているインスタンスがシャットダウンされているため、操作を完了できません。 |
JET_errTransReadOnly |
セッションには、レコードを更新するための書き込みアクセス許可が必要です。 |
JET_errWriteConflict |
競合する更新が要求されたときに返されるエラー。 |
解説
通常、2 つのセッションでレコードを同時に更新しようとすると、セッションが完全にシリアル化されない限り、2 番目のセッションはJET_errWriteConflictエラーを受け取ります。 同じレコードを更新する 2 つのセッションをシリアル化するには、2 番目のセッションは、最初のトランザクションがトランザクションをコミットした後にトランザクションを開始する必要があります。 詳細については、「 JetBeginTransaction 」を参照してください。
同じレコード内の複数の列をエスクロー更新できます。 更新は互いに影響しません。
JetEscrowUpdate 操作のみが相互に互換性があります。 2 つの異なるセッションで更新の準備または同じレコードの削除を試みると、書き込みの競合が生成されます。
セッション B |
||||
---|---|---|---|---|
JetEscrowUpdate |
JET_errSuccess |
JET_errWriteConflict |
JET_errWriteConflict |
|
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
||
セッション A |
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
エスクロー操作はバージョン管理され、 JetRollback を使用して元に戻されます (JET_bitEscrowNoRollback指定されていない限り)。 JetEscrowUpdate は、データベースに格納されている列の生の値を返します。これは、アプリケーションがセンチネル値にヒットしたときに特別なアクションを実行する場合があるためです。 JetRetrieveColumn は 列の正しいバージョン管理されたビューを返し、同時セッションによって行われた更新は無視されます。
同じレコードの同じ列で 2 つのセッションが動作している場合、このしくみを確認できます。 列の先頭の値が 0 であるとします。
Session |
操作 |
格納された値 |
戻り値 |
---|---|---|---|
A |
|||
A |
0 |
||
A |
JetEscrowUpdate (4) |
4 |
0 |
A |
4 |
||
B |
|||
B |
0 |
||
B |
JetEscrowUpdate (3) |
7 |
4 |
B |
3 |
||
A |
JetEscrowUpdate (2) |
9 |
7 |
A |
JetEscrowUpdate (-7) |
2 |
9 |
B |
3 |
||
A |
-1 |
||
B |
-1 |
||
A |
-1 |
レコードのエスクロー更新を実行するのと同じトランザクション内のレコードを置き換えることはお勧めしません。 特に、レコードの更新が 1 つのJET_TABLEID で準備され、別の JET_TABLEID を使用してレコードをエスクロー更新する場合、 JetUpdate が呼び出されると、更新されたエスクローは失われます。 これは、更新中にエスクロー列が設定されていない場合でも発生します。
エスクロー更新可能列の値が 0 の場合は、特別な動作をトリガーできます。 この動作は 、JetEscrowUpdate 操作によって列の値が 0 になる場合にのみ発生します。 アクションはすぐには実行されませんが、列の値が 0 のコミットの原因となったトランザクションの後に発生することがあります。 列の値は 0 である必要があります (つまり、他のセッションで列が変更されていない場合)。 列が JET_bitColumnDeleteOnZero で作成された場合、その列を含むレコードは削除されます。 列が JET_bitColumnFinalize で作成された場合は、コールバックが発行されます。 クラッシュすると、これらのアクションが発生しない可能性がありますが、オンライン メンテナンス ( JetDefragment 関数を使用) はアクションを正しくやり直します。
必要条件
要件 | 値 |
---|---|
Client |
Windows Vista、Windows XP、または Windows 2000 Professional が必要です。 |
[サーバー] |
Windows Server 2008、Windows Server 2003、または Windows 2000 Server が必要です。 |
Header |
Esent.h で宣言されています。 |
Library |
ESENT.lib を使用します。 |
[DLL] |
ESENT.dllが必要です。 |
参照
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragment
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate