로컬 트랜잭션 지원

세션은 SQL Server Native Client OLE DB 공급자 로컬 트랜잭션에 대한 트랜잭션 scope 구분합니다. 소비자의 지시에 따라 SQL Server Native Client OLE DB 공급자가 SQL Server 연결된 instance 요청을 제출하면 요청은 SQL Server Native Client OLE DB 공급자에 대한 작업 단위를 구성합니다. 로컬 트랜잭션은 항상 단일 SQL Server Native Client OLE DB 공급자 세션에서 하나 이상의 작업 단위를 래핑합니다.

기본 SQL Server Native Client OLE DB 공급자 자동 커밋 모드를 사용하면 단일 작업 단위가 로컬 트랜잭션의 scope 처리됩니다. 하나의 단위만 로컬 트랜잭션에 참여합니다. 세션이 만들어지면 SQL Server Native Client OLE DB 공급자가 세션에 대한 트랜잭션을 시작합니다. 작업 단위가 성공적으로 완료되면 해당 작업이 커밋됩니다. 실패하면 시작된 모든 작업이 롤백되며 소비자에게 오류가 반환됩니다. 두 경우 모두 SQL Server Native Client OLE DB 공급자는 모든 작업이 트랜잭션 내에서 수행되도록 세션에 대한 새 로컬 트랜잭션을 시작합니다.

SQL Server Native Client OLE DB 공급자 소비자는 ITransactionLocal 인터페이스를 사용하여 로컬 트랜잭션 scope 보다 정확하게 제어할 수 있습니다. 소비자 세션이 트랜잭션을 시작하면 트랜잭션 시작점과 결과 Commit 또는 Abort 메서드 호출 시점 사이에 있는 모든 세션 작업 단위는 원자 단위로 처리됩니다. SQL Server Native Client OLE DB 공급자는 소비자가 트랜잭션을 수행하도록 지시할 때 암시적으로 트랜잭션을 시작합니다. 소비자가 보존을 요청하지 않으면 세션은 일반적으로 자동 커밋 모드인 부모 트랜잭션 수준 동작으로 돌아갑니다.

SQL Server Native Client OLE DB 공급자는 다음과 같이 ITransactionLocal::StartTransaction 매개 변수를 지원합니다.

매개 변수 Description
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 개체를 요청합니다. 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 매개 변수를 구현합니다.

매개 변수 Description
pboidReason[in] 설정된 경우 무시됩니다. NULL이어도 안전합니다.
fRetaining[in] TRUE인 경우 해당 세션을 위한 새 트랜잭션이 암시적으로 시작됩니다. 이 트랜잭션은 소비자가 커밋 또는 종료해야 합니다. FALSE이면 SQL Server Native Client OLE DB 공급자가 세션에 대한 자동 커밋 모드로 되돌아갑니다.
fAsync[in] 비동기 중단은 SQL Server Native Client OLE DB 공급자에서 지원되지 않습니다. SQL Server Native Client OLE DB 공급자는 값이 FALSE가 아니면 XACT_E_NOTSUPPORTED 반환합니다.

로컬 트랜잭션의 경우 SQL Server Native Client OLE DB 공급자는 다음과 같이 ITransaction::Commit 매개 변수를 구현합니다.

매개 변수 Description
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.  

참고 항목

트랜잭션
스냅샷 격리 작업