ローカル トランザクションのサポート

SQL Server Native Client OLE DB プロバイダのローカル トランザクションのトランザクション スコープは、セッションで区切られます。コンシューマの指示により、SQL Server Native Client OLE DB プロバイダから SQL Server の接続済みインスタンスに要求を送信すると、この要求が SQL Server Native Client OLE DB プロバイダの 1 作業単位になります。ローカル トランザクションは、常に、SQL Server Native Client OLE DB プロバイダの 1 セッションについて 1 つ以上の作業単位をラップします。

SQL Server Native Client OLE DB プロバイダの既定の自動コミット モードを使用すると、1 つの作業単位がローカル トランザクションのスコープとして扱われます。ローカル トランザクションに参加するのは、1 単位のみです。セッションが作成されると、SQL Server Native Client OLE DB プロバイダは、そのセッションのトランザクションを開始します。作業単位の処理が正常に完了すると、その作業がコミットされます。失敗すると、開始された作業がすべてロールバックされ、エラーがコンシューマに報告されます。いずれの場合も、SQL Server Native Client OLE DB プロバイダは、同じセッションの新しいローカル トランザクションを開始し、すべての作業が 1 トランザクション内で実行されるようにします。

SQL Server Native Client OLE DB プロバイダのコンシューマは、ITransactionLocal インターフェイスを使用することで、より正確にローカル トランザクションのスコープを制御できます。コンシューマのセッションがトランザクションを開始すると、トランザクションの開始時点から、最終的に Commit または Abort メソッドが呼び出されるまでのセッションの作業単位すべてが、1 つのアトミックな単位として扱われます。SQL Server Native Client OLE DB プロバイダは、コンシューマからの指示により、暗黙的にトランザクションを開始します。コンシューマがモードの保持を要求しないと、セッションは親のトランザクション レベルの動作 (通常は、自動コミット モード) に戻ります。

SQL Server Native Client OLE DB プロバイダでは、次の ITransactionLocal::StartTransaction パラメータをサポートします。

パラメータ

説明

isoLevel[in]

このトランザクションで使用する分離レベルを指定します。ローカル トランザクションの場合、SQL Server Native Client OLE DB プロバイダは次のレベルをサポートします。

  • ISOLATIONLEVEL_UNSPECIFIED

  • ISOLATIONLEVEL_CHAOS

  • ISOLATIONLEVEL_READUNCOMMITTED

  • ISOLATIONLEVEL_READCOMMITTED

  • ISOLATIONLEVEL_REPEATABLEREAD

  • ISOLATIONLEVEL_CURSORSTABILITY

  • ISOLATIONLEVEL_REPEATABLEREAD

  • ISOLATIONLEVEL_SERIALIZABLE

  • ISOLATIONLEVEL_ISOLATED

  • ISOLATIONLEVEL_SNAPSHOT

注意
SQL Server 2005 以降では、データベースのバージョン管理が有効でも無効でも、ISOLATIONLEVEL_SNAPSHOT は isoLevel の引数として有効です。ただし、ユーザーがステートメントを実行する際に、バージョン管理が有効か、データベースが読み取り専用の場合は、エラーが発生します。また、SQL Server 2005 より前のバージョンの SQL Server に接続している場合に、isoLevel に ISOLATIONLEVEL_SNAPSHOT を指定すると、XACT_E_ISOLATIONLEVEL エラーが発生します。

isoFlags[in]

0 以外の値を指定すると、SQL Server Native Client OLE DB プロバイダがエラーを返します。

pOtherOptions[in]

NULL 以外の場合、SQL Server Native Client OLE DB プロバイダでは、インターフェイスからのオプション オブジェクトが要求されます。このオプション オブジェクトの ulTimeout メンバが 0 以外の場合、SQL Server Native Client OLE DB プロバイダは XACT_E_NOTIMEOUT を返します。SQL Server Native Client OLE DB プロバイダでは、szDescription メンバの値は無視されます。

pulTransactionLevel[out]

NULL 以外の場合、SQL Server Native Client OLE DB プロバイダは、トランザクションの入れ子のレベルを返します。

ローカル トランザクションの場合、SQL Server Native Client OLE DB プロバイダでは、ITransaction::Abort パラメータを次のように実装します。

パラメータ

説明

pboidReason[in]

設定しても無視されます。NULL を指定しても問題ありません。

fRetaining[in]

TRUE のときは、セッションの新しいトランザクションが暗黙的に開始されます。このトランザクションは、コンシューマがコミットまたは終了する必要があります。FALSE のときは、SQL Server Native Client OLE DB プロバイダのセッションのモードが自動コミット モードに戻ります。

fAsync[in]

SQL Server Native Client OLE DB プロバイダは、非同期アボートをサポートしません。この値が FALSE 以外の場合、SQL Server Native Client OLE DB プロバイダは XACT_E_NOTSUPPORTED を返します。

ローカル トランザクションの場合、SQL Server Native Client OLE DB プロバイダでは、ITransaction::Commit パラメータを次のように実装します。

パラメータ

説明

fRetaining[in]

TRUE のときは、セッションの新しいトランザクションが暗黙的に開始されます。このトランザクションは、コンシューマがコミットまたは終了する必要があります。FALSE のときは、SQL Server Native Client OLE DB プロバイダのセッションのモードが自動コミット モードに戻ります。

grfTC[in]

SQL Server Native Client OLE DB プロバイダでは、非同期応答と 1 フェーズの応答をサポートしません。XACTTC_SYN 以外の値を指定すると、SQL Server Native Client OLE DB プロバイダは XACT_E_NOTSUPPORTED を返します。

grfRM[in]

0 を指定する必要があります。

セッションの SQL Server Native Client OLE DB プロバイダの行セットは、行セット プロパティ DBPROP_ABORTPRESERVE と DBPROP_COMMITPRESERVE の値に基づいて、ローカル コミット操作時またはアボート操作時に保存されます。既定では、これらのプロパティの値はどちらも VARIANT_FALSE で、セッションのすべての SQL Server Native Client OLE DB プロバイダの行セットは、アボート操作またはコミット操作が行われると失われます。

SQL Server Native Client OLE DB プロバイダは、ITransactionObject インターフェイスを実装しません。このインターフェイスへの参照を取得しようとすると、コンシューマは E_NOINTERFACE を返します。

次の例は、ITransactionLocal を使用します。

// Interfaces used in the example.
IDBCreateSession*   pIDBCreateSession   = NULL;
ITransaction*       pITransaction       = NULL;
IDBCreateCommand*   pIDBCreateCommand   = NULL;
IRowset*            pIRowset            = NULL;

HRESULT             hr;

// Get the command creation and local transaction interfaces for the
// session.
if (FAILED(hr = pIDBCreateSession->CreateSession(NULL,
     IID_IDBCreateCommand, (IUnknown**) &pIDBCreateCommand)))
    {
    // Process error from session creation. Release any references and
    // return.
    }

if (FAILED(hr = pIDBCreateCommand->QueryInterface(IID_ITransactionLocal,
    (void**) &pITransaction)))
    {
    // Process error. Release any references and return.
    }

// Start the local transaction.
if (FAILED(hr = ((ITransactionLocal*) pITransaction)->StartTransaction(
    ISOLATIONLEVEL_REPEATABLEREAD, 0, NULL, NULL)))
    {
    // Process error from StartTransaction. Release any references and
    // return.
    }

// Get data into a rowset, then update the data. Functions are not
// illustrated in this example.
if (FAILED(hr = ExecuteCommand(pIDBCreateCommand, &pIRowset)))
    {
    // Release any references and return.
    }

// If rowset data update fails, then terminate the transaction, else
// commit. The example doesn't retain the rowset.
if (FAILED(hr = UpdateDataInRowset(pIRowset, bDelayedUpdate)))
    {
    // Get error from update, then terminate.
    pITransaction->Abort(NULL, FALSE, FALSE);
    }
else
    {
    if (FAILED(hr = pITransaction->Commit(FALSE, XACTTC_SYNC, 0)))
        {
        // Get error from failed commit.
        }
    }

if (FAILED(hr))
    {
    // Update of data or commit failed. Release any references and
    // return.
    }

// Release any references and continue.