セッションは、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 メソッド呼び出しの間のすべてのセッション作業単位がアトミック単位として扱われます。 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 に接続するときに、ISOLATIONLEVEL_SNAPSHOTが isoLevel として指定されている場合、エラー XACT_E_ISOLATIONLEVELが発生します。 |
| isoFlags[in] | SQL Server Native Client OLE DB プロバイダーは、0 以外の値に対してエラーを返します。 |
| pOtherOptions[in] | NULL でない場合、SQL Server Native Client OLE DB プロバイダーはインターフェイスから options オブジェクトを要求します。 オプション オブジェクトの 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] | 非同期およびフェーズ 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.