다음을 통해 공유


로컬 트랜잭션 지원

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

OLE DB 드라이버 다운로드

세션은 SQL Server용 OLE DB 드라이버 로컬 트랜잭션에 대한 트랜잭션 범위를 구분합니다. 소비자의 지시에 따라 OLE DB Driver for SQL Server가 SQL Server의 연결된 인스턴스에 요청을 제출하면 요청은 OLE DB Driver for SQL Server에 대한 작업 단위를 구성합니다. 로컬 트랜잭션은 항상 단일 OLE DB Driver for SQL Server 세션에서 하나 이상의 작업 단위를 래핑합니다.

기본 OLE DB Driver for SQL Server 자동 커밋 모드를 사용하면 단일 작업 단위가 로컬 트랜잭션의 범위로 처리됩니다. 하나의 단위만 로컬 트랜잭션에 참여합니다. 세션이 생성되면 OLE DB Driver for SQL Server가 해당 세션에 대한 트랜잭션을 시작합니다. 작업 단위가 성공적으로 완료되면 작업이 커밋됩니다. 실패하면 시작된 모든 작업이 롤백되고 오류가 소비자에게 보고됩니다. 두 경우 모두 SQL Server용 OLE DB 드라이버는 모든 작업이 한 트랜잭션 내에서 수행될 수 있도록 해당 세션에 대한 새로운 로컬 트랜잭션을 만듭니다.

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

OLE DB Driver for SQL Server는 다음과 같이 ITransactionLocal::StartTransaction 매개 변수를 지원합니다.

매개 변수 설명
isoLevel[in] 이 트랜잭션에 사용할 격리 수준입니다. 로컬 트랜잭션에서 OLE DB Driver for SQL Server는 다음을 지원합니다.

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] OLE DB Driver for SQL Server는 0이 아닌 값에 대한 오류를 반환합니다.
pOtherOptions[in] NULL이 아닌 경우 OLE DB Driver for SQL Server는 인터페이스에서 옵션 개체를 요청합니다. 옵션 개체의 ulTimeout 멤버가 0이 아닌 경우 OLE DB Driver for SQL Server는 XACT_E_NOTIMEOUT을 반환합니다. OLE DB Driver for SQL Server는 szDescription 멤버의 값을 무시합니다.
pulTransactionLevel[out] NULL이 아닌 경우 SQL Server용 OLE DB 드라이버는 트랜잭션의 중첩된 수준을 반환합니다.

로컬 트랜잭션의 경우 OLE DB Driver for SQL Server는 다음과 같이 ITransaction::Abort 매개 변수를 구현합니다.

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

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

매개 변수 설명
fRetaining[in] TRUE인 경우 해당 세션을 위한 새 트랜잭션이 암시적으로 시작됩니다. 트랜잭션은 소비자가 커밋하거나 종료해야 합니다. FALSE인 경우 OLE DB Driver for SQL Server는 해당 세션을 자동 커밋 모드로 되돌립니다.
grfTC[in] OLE DB Driver for SQL Server는 비동기 및 1단계 반환을 지원하지 않습니다. OLE DB Driver for SQL Server는 XACTTC_SYNC 이외의 값에 대한 XACT_E_NOTSUPPORTED 반환합니다.
grfRM[in] 0이어야 합니다.

세션의 SQL Server용 OLE DB 드라이버 행 집합은 행 집합 속성 DBPROP_ABORTPRESERVE 및 DBPROP_COMMITPRESERVE 값에 따라 로컬 커밋 또는 중단 작업에서 보존됩니다. 기본적으로 이러한 속성은 모두 VARIANT_FALSE 세션의 모든 OLE DB Driver for SQL Server 행 집합은 중단 또는 커밋 작업 후에 손실됩니다.

OLE DB Driver for SQL Server는 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.  

참고 항목

트랜잭션
스냅샷 격리 작업