트랜잭션 - 가용성 그룹 및 데이터베이스 미러링

적용 대상:SQL Server

이 문서에서는 Always On 가용성 그룹 및 데이터베이스 미러링에 대한 데이터베이스 간 트랜잭션 및 분산 트랜잭션 지원에 대해 설명합니다.

분산 트랜잭션 지원

SQL Server 2017은 가용성 그룹의 데이터베이스에 대한 분산 트랜잭션을 지원합니다. 이 지원의 대상에는 SQL Server의 동일한 인스턴스에 있는 데이터베이스 또는 SQL Server의 다른 인스턴스에 있는 데이터베이스가 포함됩니다. 분산 트랜잭션은 데이터베이스 미러링을 위해 구성된 데이터베이스에 대해 지원되지 않습니다.

참고 항목

SQL Server 2016(13.x) 서비스 팩 2 이상에서는 가용성 그룹의 분산 트랜잭션을 완벽하게 지원합니다.

서비스 팩 2 이전의 SQL Server 2016(13.x) 버전에서는 가용성 그룹의 데이터베이스와 관련한 데이터베이스 간 분산 트랜잭션(즉, 동일한 SQL Server 인스턴스의 데이터베이스를 사용하는 트랜잭션)이 지원되지 않습니다.

분산 트랜잭션에 대한 가용성 그룹을 구성하려면 분산 트랜잭션에 대한 가용성 그룹 구성을 참조하세요.

자세한 내용은 다음을 참조하세요.

SQL Server 2016 SP1 이전 버전: 동일한 SQL Server 인스턴스 내의 데이터베이스 간 트랜잭션 지원

SQL Server 2016 SP1 이전 버전에서는 가용성 그룹에 대해 동일한 SQL Server 인스턴스 내의 데이터베이스 간 트랜잭션이 지원되지 않습니다. 둘 중 하나 또는 두 데이터베이스 모두가 가용성 그룹에 있는 경우 데이터베이스 간 트랜잭션의 두 데이터베이스가 동일한 SQL Server 인스턴스에서 호스트될 수 없습니다. 해당 데이터베이스가 같은 가용성 그룹에 속하는 경우에도 이 제한 사항이 적용됩니다.

데이터베이스 미러링에 대해서는 데이터베이스 간 트랜잭션이 지원되지 않습니다.

SQL Server 2016 SP1 및 이전 버전: 분산 트랜잭션 지원

분산 트랜잭션은 데이터베이스가 다른 SQL Server 인스턴스에서 호스트되는 경우에 가용성 그룹에서 지원됩니다. 이는 SQL Server 인스턴스와 다른 DTC 규격 서버 간의 분산 트랜잭션에도 적용됩니다.

MSDTC 또는 DTC(Microsoft Distributed Transaction Coordinator)는 분산 시스템에 대한 트랜잭션 인프라를 제공하는 Windows 서비스입니다. MSDTC는 클라이언트 애플리케이션이 한 트랜잭션에 여러 데이터 원본을 포함한 다음 트랜잭션에 포함된 모든 서버에서 커밋할 수 있게 합니다. 예를 들어 MSDTC를 사용하여 여러 서버의 여러 데이터베이스에 걸쳐 실행되는 트랜잭션을 조정할 수 있습니다.

SQL Server 2016에서는 트랜잭션의 데이터베이스 중 하나 이상이 가용성 그룹에 포함되어 있는 분산 트랜잭션을 사용하는 기능이 도입되었습니다. SQL Server 2016 이전에는 가용성 그룹의 데이터베이스에 대해 분산 트랜잭션이 지원되지 않았습니다. SQL Server 2016에서는 데이터베이스당 하나의 리소스 관리자를 등록할 수 있습니다. 이 새로운 기능 덕분에 가용성 그룹의 데이터베이스를 분산 트랜잭션에 포함할 수 있게 되었습니다.

다음 요구 사항을 충족해야 합니다.

  • 가용성 그룹이 Windows Server 2012 R2 이상에서 실행되어야 합니다. Windows Server 2012 R2의 경우 https://support.microsoft.com/kb/3090973에서 제공되는 KB3090973의 업데이트를 설치해야 합니다.

  • Availability groups must be created with the CREATE AVAILABILITY GROUP 명령 및 WITH DTC_SUPPORT = PER_DB 절을 사용하여 가용성 그룹을 만들어야 합니다. 현재는 기존 가용성 그룹을 변경할 수 없습니다.

  • 가용성 그룹에 참여하는 모든 SQL Server 인스턴스가 SQL Server 2016 이상이어야 합니다.

분산 트랜잭션이 지원되지 않음

분산 트랜잭션이 지원되지 않는 구체적인 사례는 다음과 같습니다.

  • SQL Server 2016 SP1 이전 버전에서 트랜잭션에 관련된 둘 이상의 데이터베이스가 동일한 가용성 그룹에 있는 경우

  • SQL Server 2016 SP1 이전 버전에서 하나 이상의 데이터베이스가 가용성 그룹에 있고, 또 다른 데이터베이스가 SQL Server의 동일한 인스턴스에 있는 경우

  • 가용성 그룹이 분산 트랜잭션을 사용하도록 설정한 상태로 만들어지지 않은 경우.

  • 데이터베이스 미러링.

Important

사용자 환경에 대해 DTC가 확인할 수 없는 트랜잭션의 적절한 기본 결과를 확인합니다. 기본 결과를 구성하는 방법에 대한 내용은 in-doubt xact resolution 서버 구성 옵션을 참조하세요.

데이터베이스 미러링을 사용한 예제 시나리오

다음 데이터베이스 미러링 예제에서는 논리적 불일치가 어떻게 발생하는지 보여 줍니다. 이 예제에서 응용 프로그램은 데이터베이스 간 트랜잭션을 사용하여 두 개의 데이터 행을 삽입합니다. 그중 한 행은 미러링된 데이터베이스 A의 테이블에 삽입되고 다른 행은 다른 데이터베이스 B의 테이블에 삽입됩니다. 데이터베이스 A는 자동 장애 조치(failover)를 사용하여 안전성이 높은 모드로 미러링됩니다. 트랜잭션이 커밋되는 동안 데이터베이스 A를 사용할 수 없게 되고, 미러링 세션이 데이터베이스 A의 미러로 자동 장애 조치(failover)됩니다.

장애 조치 후에 데이터베이스 B에서는 데이터베이스 간 트랜잭션이 성공적으로 커밋될 수 있지만 장애 조치된 데이터베이스에서는 커밋되지 않습니다. 데이터베이스 A의 원래 주 서버가 실패하기 전에 데이터베이스 간 트랜잭션에 대한 로그를 미러 서버에 보내지 않은 경우를 예를 들 수 있습니다. 장애 조치(failover) 후에는 해당 트랜잭션이 새 주 서버에 존재하지 않게 됩니다. 데이터베이스 B에 삽입된 데이터는 그대로 남아 있지만 데이터베이스 A에 삽입된 데이터는 손실되었으므로, 데이터베이스 A와 B가 일관되지 않게 됩니다.

MS DTC 트랜잭션을 사용하는 동안 유사한 시나리오가 발생할 수 있습니다. 예를 들어 장애 조치(failover) 후 새 보안 주체는 MS DTC에 연결합니다. 하지만 MS DTC는 새 주 서버를 인식하지 못하며 다른 데이터베이스에서 커밋된 것으로 간주되는 "커밋 준비 중"인 모든 트랜잭션을 종료합니다.

참고 항목

이 아티클에서 승인되지 않은 방식으로 DTC에서 데이터베이스 미러링 또는 가용성 그룹을 사용하는 것은 지원되지 않습니다. 그렇다고 이 제품에서 DTC와 관련이 없는 측면이 지원되지 않음을 의미하지는 않습니다. 단, 분산 트랜잭션의 부적절한 사용으로 인해 발생하는 문제는 지원되지 않습니다.

다음 단계

Always On 가용성 그룹: 상호 운용성(SQL Server)