로컬 트랜잭션 지원
세션은 SQL Server Native Client OLE DB 공급자 로컬 트랜잭션의 트랜잭션 범위를 지정합니다. 소비자의 지시에 따라 SQL Server Native Client OLE DB 공급자가 연결된 SQL Server 인스턴스로 요청을 제출하면 SQL Server Native Client OLE DB 공급자에 대한 작업 단위가 구성됩니다. 로컬 트랜잭션은 단일 SQL Server Native Client OLE DB 공급자 세션에서 항상 한 개 이상의 작업 단위를 래핑합니다.
기본 SQL Server Native Client OLE DB 공급자 자동 커밋 모드를 사용하면 단일 작업 단위가 로컬 트랜잭션 범위로 처리됩니다. 하나의 단위만 로컬 트랜잭션에 참여합니다. 세션이 생성되면 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 공급자는 다음을 지원합니다.
|
isoFlags[in] |
값이 0이 아니면 SQL Server Native Client OLE DB 공급자가 오류를 반환합니다. |
pOtherOptions[in] |
NULL이 아니면 SQL Server Native Client OLE DB 공급자는 인터페이스에서 옵션 개체를 요청합니다. SQL Server Native Client OLE DB 공급자는 옵션 개체의 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] |
SQL Server Native Client OLE DB 공급자는 비동기 및 1단계 반환을 지원하지 않습니다. XACTTC_SYNC 외의 다른 값에 대해 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.