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