증상

Microsoft SQL Server WITH DTC_SUPPORT = PER_DB 절을 사용하여 가용성 그룹을 만든다고 가정합니다. 트랜잭션 또는 시스템 저장 프로시저(예: sp_executesql)에서 SAVE TRANSACTION 문을 실행하려고 하면 다음 오류 메시지 중 하나가 표시됩니다.

Msg 627, Level 16, State 0, Line LineNumber
분산 트랜잭션 내에서 SAVE TRANSACTION을 사용할 수 없습니다.
Msg 12324, Level 16, State 100, LineNumber
DTC(분산 트랜잭션)는 메모리 최적화 테이블에서 지원되지 않습니다.
오류: 3933, 심각도: 16, 상태: 1.
이 트랜잭션에 활성 저장 지점이 있으므로 트랜잭션을 분산 트랜잭션으로 승격할 수 없습니다.

원인

트랜잭션에 여러 데이터베이스가 포함된 한 Always On 가용성 그룹의 데이터베이스가 WITH DTC_SUPPORT = PER_DB 사용하도록 설정된 경우 트랜잭션은 SQL Server 2016 SP2 및 SQL Server 2017에서 MSDTC 트랜잭션으로 승격됩니다. MSDTC 트랜잭션에는 제한 사항이 있습니다. 예를 들어 저장 지점을 사용할 수 없고 메모리 최적화 테이블을 사용할 수 없습니다.

경우에 따라 데이터베이스 간 트랜잭션은 사용자가 두 개의 사용자 데이터베이스를 포함하는 트랜잭션이 있기 때문이 아니라 트랜잭션에 현재 데이터베이스 및 시스템 데이터베이스(master, tempdb, 모델, 시스템 리소스 데이터베이스)가 포함되므로 발생합니다. 시스템 리소스 데이터베이스는 실제로 읽기 전용이므로 데이터베이스 간 트랜잭션에 시스템 리소스 데이터베이스가 포함되지만 다른 시스템 데이터베이스는 포함되지 않은 경우 MSDTC 트랜잭션으로 승격할 필요가 없습니다. 

해결 방법

이 KB에 도입된 수정 사항은 시스템 리소스 데이터베이스와 PER_DB DTC에 사용하도록 설정된 가용성 그룹의 일부인 사용자 데이터베이스가 동일한 SQL Server 인스턴스 내의 데이터베이스 간 트랜잭션에 관련된 경우 MSDTC 트랜잭션으로의 승격을 건너뜁니다.

따라서 위에 나열된 오류의 원래 원인이 시스템 리소스 데이터베이스와 관련된 데이터베이스 간 트랜잭션인 경우 이 수정 사항이 해결됩니다. 경우에 따라 사용자는 동일한 근본 원인으로 위에 나열된 오류를 볼 수 있습니다. 다음은 이 수정 사항이 적용되는 조건을 나열합니다.

  • 데이터베이스는 WITH DTC_SUPPORT = PER_DB 사용하도록 설정된 Always On 가용성 그룹의 일부입니다.

  • 데이터베이스 간 트랜잭션에는 이 데이터베이스와 동일한 SQL Server 인스턴스의 시스템 리소스 데이터베이스가 포함됩니다.

  • 데이터베이스 간 트랜잭션 내에서 SAVE TRANSACTION이 사용되거나 메모리 최적화 테이블이 관련됩니다.

이러한 트랜잭션은 이 수정 없이 위에 나열된 오류로 실패합니다. 이 수정을 사용하면 이러한 트랜잭션이 진행되어야 합니다.

참고: 이 수정은 시스템 리소스 데이터베이스를 포함하는 데이터베이스 간 트랜잭션을 해결하지만 사용자 데이터베이스를 포함하고 SAVE TRANSACTION 문을 포함하는 모든 데이터베이스 간 트랜잭션은 여전히 실패하며 다시 작성해야 합니다.

이 문제는 SQL Server 대한 다음 누적 업데이트에서 해결되었습니다.

SQL Server 대한 각각의 새로운 누적 업데이트에는 모든 핫픽스 및 이전 누적 업데이트에 포함된 모든 보안 수정 사항이 포함됩니다. SQL Server 대한 최신 누적 업데이트를 확인하세요.

추가 정보

DTC_SUPPORT = PER_DB, 메모리 최적화 테이블, SAVE TRANSACTION에 대한 추가 정보는 다음 링크에서 찾을 수 있습니다.

동일한 SQL Server 인스턴스 내의 데이터베이스 트랜잭션은 이 파트를 https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017#sql-server-2016-sp1-and-before-support-for-cross-database-transactions-within-the-same-sql-server-instance
메모리 최적화 테이블에 연결합니다. 트랜잭션 저장 https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations
이 부분을 https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks 연결

https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-replication-for-always-on-availability-groups-sql-server?view=sql-server-2017#step2

상태

Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.

참고 자료

Microsoft에서 소프트웨어 업데이트를 설명하는 데 사용하는 용어 에 대해 알아봅니다.

추가 도움이 필요하신가요?

기술 향상

교육 살펴보기 >

새로운 기능 우선 가져오기

Microsoft Insider 참가 >

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?

의견 주셔서 감사합니다!

×