ローカル トランザクションのサポート
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 プロバイダーは次のレベルをサポートします。
|
||
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.