SQL Server Native Clientでのローカル トランザクションのサポート

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

セッションは、SQL Server Native Client OLE DB プロバイダーのローカル トランザクションのトランザクション スコープを区切ります。 コンシューマーの方向で、SQL Server Native Client OLE DB プロバイダーが接続された SQL Server のインスタンスに要求を送信すると、その要求は、SQL Server Native Client OLE DB プロバイダーの作業単位を構成します。 ローカル トランザクションは、常に 1 つの ole DB プロバイダー セッションで 1 つ以上の作業単位SQL Server Native Clientラップします。

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

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 (9.x) 以降では、データベースのバージョン管理が有効でも無効でも、ISOLATIONLEVEL_SNAPSHOT は isoLevel の引数として有効です。 ただし、ユーザーがステートメントを実行する際に、バージョン管理が有効か、データベースが読み取り専用の場合は、エラーが発生します。 また、SQL Server 2005 (9.x) より前のバージョンの SQL Server に接続している場合に、isoLevel に ISOLATIONLEVEL_SNAPSHOT を指定すると、XACT_E_ISOLATIONLEVEL エラーが発生します。
isoFlags[in] SQL Server Native Client OLE DB プロバイダーは、0 以外の値に対してエラーを返します。
pOtherOptions[in] NULL でない場合、SQL Server Native Client OLE DB プロバイダーはインターフェイスから options オブジェクトを要求します。 SQL Server Native Client OLE DB プロバイダーは、options オブジェクトの ulTimeout メンバーが 0 でない場合にXACT_E_NOTIMEOUTを返します。 SQL Server Native Client OLE DB プロバイダーは、szDescription メンバーの値を無視します。
pulTransactionLevel[out] NULL でない場合、OLE DB プロバイダー SQL Server Native Clientは、トランザクションの入れ子になったレベルを返します。

ローカル トランザクションの場合、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 でない場合、OLE DB プロバイダー SQL Server Native ClientはXACT_E_NOTSUPPORTEDを返します。

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

パラメーター 説明
fRetaining[in] TRUE のときは、セッションの新しいトランザクションが暗黙的に開始されます。 このトランザクションは、コンシューマーがコミットまたは終了する必要があります。 FALSE の場合、SQL SERVER NATIVE CLIENT OLE DB プロバイダーはセッションの自動コミット モードに戻ります。
grfTC[in] 非同期およびフェーズ 1 の戻り値は、SQL Server Native Client OLE DB プロバイダーではサポートされていません。 SQL Server Native Client OLE DB プロバイダーは、XACTTC_SYNC以外の値のXACT_E_NOTSUPPORTEDを返します。
grfRM[in] 0 を指定する必要があります。

セッションSQL Server Native Client OLE DB プロバイダーの行セットは、DBPROP_ABORTPRESERVEおよびDBPROP_COMMITPRESERVE行セットのプロパティの値に基づいて、ローカルコミットまたは中止操作で保持されます。 既定では、これらのプロパティは両方ともVARIANT_FALSEであり、中止操作またはコミット操作の後、セッション上のすべての OLE DB プロバイダー行セットSQL Server Native Client失われます。

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.  

参照

トランザクション
スナップショット分離を使用した作業