SQL Server Native Client でのローカル トランザクションのサポート
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
セッションは、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 つ以上の作業単位をラップします。
既定の SQL Server Native Client OLE DB プロバイダー自動コミット モードを使用すると、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 でない場合、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] | 非同期およびフェーズ 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であり、セッション上のすべての 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.