분산 쿼리 및 분산 트랜잭션

SQL Server 데이터베이스 엔진에서는 연결된 서버라는 OLE DB 데이터 원본에 대한 링크를 만들 수 있습니다. OLE DB 데이터 원본에 연결한 후에는 다음을 수행할 수 있습니다.

Transact-SQL 문에서 OLE DB 데이터 원본의 행 집합을 테이블로 참조합니다.

  • OLE DB 데이터 원본에 명령을 전달하고 Transact-SQL 문에 결과 행 집합을 테이블로 포함합니다.

각 분산 쿼리는 여러 연결된 서버를 참조하고 각 연결된 서버에 대해 업데이트 또는 읽기 작업을 수행할 수 있습니다. 하나의 분산 쿼리가 일부 연결된 서버에 대해 읽기 작업을 수행하고 다른 연결된 서버에 대해 업데이트 작업을 수행할 수 있습니다. 일반적으로 데이터베이스 엔진은 여러 연결된 서버의 데이터를 트랜잭션에서 업데이트해야 할 때마다 해당 OLE DB 공급자로부터 분산 트랜잭션 지원을 받아야 합니다. 따라서 연결된 서버에 대해 지원되는 쿼리 유형은 OLE DB 공급자에서 제공하는 트랜잭션 지원 수준에 따라 다릅니다. OLE DB는 트랜잭션 관리를 위한 두 가지 옵션 인터페이스를 정의합니다.

  • ITransactionLocal은 OLE DB 데이터 원본의 로컬 트랜잭션을 지원합니다.

  • ITransactionJoin을 사용하면 공급자가 다른 리소스 관리자를 포함하는 분산 트랜잭션을 조인할 수 있습니다.

    ITransactionJoin을 지원하는 공급자는 ITransactionLocal도 지원합니다.

연결이 자동 커밋 모드일 때 분산 쿼리가 실행되면 다음과 같은 규칙이 적용됩니다.

  • ITransactionLocal을 지원하지 않는 공급자에 대해서는 읽기 작업만 허용됩니다.

  • ITransactionLocal을 지원하는 공급자에 대해서는 모든 업데이트 작업이 허용됩니다.

    데이터베이스 엔진의 제어 인스턴스에서 업데이트 작업에 참여하는 각 연결된 서버에서 자동으로 ITransactionLocal을 호출하여 로컬 트랜잭션을 시작합니다. 문이 성공하면 로컬 트랜잭션이 커밋되고 문이 실패하면 로컬 트랜잭션이 롤백됩니다.

분산 쿼리가 분산형 분할 뷰에 대해 실행되거나 연결이 명시적 또는 암시적 트랜잭션일 때 분산 쿼리가 실행되면 다음 규칙이 적용됩니다.

  • ITransactionJoin을 지원하지 않는 공급자에 대해서는 읽기 작업만 허용됩니다. 트랜잭션을 지원하지 않거나 ITransactionLocal만 지원하는 공급자는 업데이트 작업에 참여할 수 없습니다.

  • SET XACT_ABORT가 ON이면 ITransactionJoin을 지원하는 공급자에 대해 모든 업데이트 작업이 허용됩니다. 데이터베이스 엔진의 제어 인스턴스는 업데이트 작업에 참여하는 각 연결된 서버에서 ITransactionJoin을 자동으로 호출하여 분산 트랜잭션에 연결된 서버를 등록합니다. 그런 다음 제어 서버가 트랜잭션이 커밋 또는 롤백됨을 나타내면 MS DTC(Microsoft Distributed Transaction Coordinator)가 트랜잭션을 커밋하거나 롤백합니다.

  • SET XACT_ABORT가 OFF이면 연결된 서버가 중첩된 트랜잭션도 지원해야 업데이트 작업을 수행할 수 있습니다. 중첩된 트랜잭션은 해당 세션에 대한 기존 트랜잭션이 이미 있을 때 공급자가 ITransactionLocal::StartTransaction 호출을 지원하는 경우 지원됩니다. 이렇게 하면 SQL Server에서 전체 트랜잭션을 롤백하지 않고 분산 쿼리의 개별 문을 롤백할 수 있습니다.

위의 규칙은 중첩된 트랜잭션을 지원하지 않는 공급자에 대해 제한 사항이 있음을 의미합니다. 즉, 업데이트 작업은 XACT_ABORT 옵션이 ON인 경우에만 분산 트랜잭션에서 허용됩니다.

참고 항목

개념