SQL Server Native Client에서 로컬 트랜잭션 지원

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

세션은 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 공급자는 다음을 지원합니다.

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



참고: SQL Server 2005(9.x)부터 ISOLATIONLEVEL_SNAPSHOT 데이터베이스에 버전 관리가 사용되는지 여부에 관계없이 isoLevel 인수에 유효합니다. 그러나 사용자가 문을 실행하려고 시도하고 버전 관리가 사용되지 않거나 데이터베이스가 읽기 전용이 아닌 경우 오류가 발생합니다. 또한 SQL Server 2005(9.x)보다 이전 버전의 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 공급자는 인터페이스에서 옵션 개체를 요청합니다. 옵션 개체의 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 공급자는 비동기 중단을 지원하지 않습니다. SQL Server Native Client OLE DB 공급자는 값이 FALSE가 아니면 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단계 반환을 지원하지 않습니다. 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.  

참고 항목

트랜잭션
스냅샷 격리 작업