次の方法で共有


JetBeginTransaction 関数

適用対象: Windows |Windows Server

JetBeginTransaction 関数

JetBeginTransaction 関数を使用すると、セッションがトランザクションを入力し、新しい保存ポイントを作成します。 この関数は、1 つのセッションで複数回呼び出して、追加のセーブ ポイントを作成できます。 これらの保存ポイントを使用すると、データベースの状態に対する変更を選択的に保持または破棄できます。

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

パラメーター

sesid

この呼び出しに使用するセッション。

戻り値

この関数は、次のいずれかのリターン コードを使用して 、JET_ERR データ型を返します。 考えられる ESE エラーの詳細については、「 拡張可能ストレージ エンジン エラー 」および「 エラー処理パラメーター」を参照してください。

リターン コード

説明

JET_errSuccess

操作は正常に完了しました。

JET_errClientRequestToStopJetService

JetStopService の呼び出しの結果、セッションに関連付けられたインスタンス上のすべてのアクティビティが停止したため、操作を完了することはできません。

JET_errInstanceUnavailable

セッションに関連付けられているインスタンスで致命的なエラーが発生したため、操作を完了できません。このエラーでは、そのデータの整合性を保護するためにすべてのデータへのアクセスを取り消す必要があります。

このエラーは、Windows XP 以降のリリースでのみ返されます。

JET_errNotInitialized

セッションに関連付けられているインスタンスがまだ初期化されていないため、操作を完了できません。

JET_errRestoreInProgress

セッションに関連付けられているインスタンスで復元操作が進行中であるため、操作を完了できません。

JET_errSessionSharingViolation

同じセッションを複数のスレッドに同時に使用することはできません。 このエラーは、Windows XP 以降のリリースでのみ返されます。

JET_errTermInProgress

セッションに関連付けられているインスタンスがシャットダウンされているため、操作を完了できません。

JET_errTransTooDeep

セッションがデータベース エンジンによって許容される最大保存ポイントの深さになっているため、新しいトランザクションを開始できません。

成功すると、指定されたセッションはトランザクション内になります。 セッションが以前にトランザクション内にあった場合は、新しい保存ポイントが作成されます。

失敗した場合、セッションのトランザクション状態は変更されません。 データベースの状態は変更されません。

解説

データベース エンジンは、トランザクションのスナップショット分離モデルを提供します。 つまり、セッションが最初にトランザクション状態になると、トランザクションの開始時にデータベース全体が時間内に固定されます。 セッションは常にそのデータの適切なバージョンにアクセスできるため、データを読み取る必要はありません。 つまり、データを更新しているセッションによって、別のセッションがそのデータの読み取りをブロックされることはありません。

スナップショット分離の使用のもう 1 つの影響は、更新に使用されるロック モデルです。 データベース エンジンは、データを要求する最初のセッションに、特定のデータに対する書き込みロックを付与します。 この書き込みロックは、トランザクションがコミットされるか、セッションがトランザクション内に存在しなくなるまで完全に中止されると解放されます。 セッションは書き込みロックを保持しますが、同じ書き込みロックを要求する他のセッションは、書き込みロックが使用可能になるまでブロックされません。 代わりに、その 2 番目のセッションは、JET_errWriteConflictですぐに失敗します。 この競合を解決するには、2 番目のセッションでトランザクションを完全に中止 (またはコミット) し、最初のセッションがトランザクションをコミットまたは中止するまで少し待ってから、もう一度やり直す必要があります。

スナップショット分離をサポートするため、データベース エンジンは、セッションで最も古いアクティブなトランザクションが最初に開始された時点以降に、変更されたすべてのデータのすべてのバージョンをメモリに格納します。 これは、アプリケーションに重要な影響を与える。 多数のバージョンがメモリに蓄積される動作では、インスタンスが最大バージョン ストア サイズを使い果たす可能性があります (詳細については、「システム パラメーターJET_paramMaxVerPages」を参照してください)。 このような動作には、1 つのトランザクションと非常に長時間実行されるトランザクションでの非常に大きな更新が含まれますが、これらに限定されません。 その結果、アプリケーションの予想されるトランザクション 負荷のバージョン ストア サイズを適切に構成することが非常に重要です。 また、1 つのトランザクションで実行される更新の数を制限するように細心の注意を払うことも重要です。 さらに、負荷の高いシナリオでは、トランザクションを可能な限り短い期間にすることが重要です。

データを取得または更新する ESE API を呼び出すときは、アプリケーションが常にトランザクションのコンテキストに存在することを強くお勧めします。 これが行われなければ、データベース エンジンは、アプリケーションに代わって、この型の各 ESE API 呼び出しをトランザクションで自動的にラップします。 これらの非常に短いトランザクションのコストは、場合によっては迅速に加算される可能性があります。

エンジンの既定の動作では、JetBeginTransaction の最初の呼び出しが行われた時点から、JetCommitTransaction または JetRollback への一致する呼び出しが行われるまで、セッションの使用を同じスレッドに制限します。 JetSetSessionContext と JetResetSessionContext を使用してカスタム セッション コンテキストを設定することで、この制限を削除するようにこの動作変更できます。

データベース エンジンでは、トランザクション スキーマの変更もサポートされています。 たとえば、新しいトランザクションを開始し、テーブルを作成し、いくつかの列を追加し、インデックスを 1 つまたは 2 つ作成してから、トランザクションを中止することができます。 追加したばかりのスキーマ要素は、データベースから削除されます。 スキーマの変更と通常のデータベース更新を同じトランザクションに混在させることもできます。

要件

要件

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_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
システム パラメーター