次の方法で共有


JetSetSessionContext 関数

適用対象: Windows |Windows Server

JetSetSessionContext 関数

JetSetSessionContext 関数は、指定されたコンテキスト ハンドルを使用して、セッションを現在のスレッドに関連付けます。 この関連付けにより、特定のセッションのトランザクションが完全に同じスレッドで実行される必要がある既定のエンジン要件がオーバーライドされます。

    JET_ERR JET_API JetSetSessionContext(
      __in          JET_SESID sesid,
      __in          JET_API_PTR ulContext
    );

パラメーター

sesid

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

ulContext

このセッションが関連付けられる一意の識別子。

戻り値

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

リターン コード

説明

JET_errSuccess

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

JET_errClientRequestToStopJetService

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

JET_errInstanceUnavailable

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

Windows XP: この戻り値は Windows XP で導入されています。

JET_errInvalidParameter

指定されたパラメーターの 1 つに予期しない値が含まれていたか、複数のパラメーター値の組み合わせによって予期しない結果が発生しました。 このエラーは、 JetSetSessionContext によって次の条件で返されます。

  • ulContext は NULL です

  • ulContext は -1 です

JET_errNotInitialized

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

JET_errRestoreInProgress

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

JET_errSessionContextAlreadySet

セッションは既にスレッドに関連付けられているため、現在のスレッドに関連付けできませんでした。

JET_errTermInProgress

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

この関数が成功すると、セッションは現在のスレッドに関連付けられます。 データベースの状態は変更されません。

この関数が失敗した場合、セッションの状態は変更されません。 データベースの状態は変更されません。

注釈

セッションは通常、トランザクションの間、特定のスレッドにバインドされます。 この動作は、アプリケーションが複数のスレッド間で 1 つのセッションを概念的に不適切に共有することを検出して防ぐのに役立つよう設計されています。 場合によっては、この単純なチェックはアプリケーションのアーキテクチャでは機能しません。 たとえば、アプリケーションがスレッド プールを使用してサーバー側オブジェクトをホストしていて、トランザクションが特定のオブジェクトに対する複数のサーバー呼び出しにまたがる場合、この保護により、使用パターンが正しい場合でも、これらの呼び出しの一部が JET_errSessionSharingViolation で失敗する可能性があります。 この状況は、COM オブジェクト サーバーで一般的です。

JetSetSessionContextJetResetSessionContext は、このセッション共有チェックもう少し柔軟にすることで、この問題を解決します。 アプリケーションは、特定のセッションを使用して一連の ESE API 呼び出しを開始すると、最初にセッション コンテキストを特定の値に設定します。 このアクションにより、セッションが呼び出し元のスレッドに関連付けられます。 この例では、このコンテキストは、JET セッション ハンドルを含むオブジェクトのアドレスである可能性があります。 ESE API 呼び出しが行われると、アプリケーションはセッション コンテキストをリセットします。 このアクションにより、呼び出し元スレッドからセッションの関連付けが解除されます。 オブジェクトとそのセッションは、セッションにアクティブなトランザクションがある場合でも、別のスレッドで使用できます。

そのセッションでトランザクションを開く前に JetSetSessionContext を呼び出す必要があります。または、関連付けが機能しないことに注意してください。

JetSetSessionContext はスレッド セーフです。 複数のスレッドが同時に同じセッションにスレッド コンテキストを設定しようと試みることができ、1 つだけが優先されます。 この事実は、割り当てに関する外部状態を格納せずに、プールからセッションを割り当てる手段としてアプリケーションで使用できます。

要件

要件

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_API_PTR
JET_ERR
JetResetSessionContext
JET_SESID
JetStopService