2007~2011/SQL Server2009.10.22 00:01

하나의 트랜잭션으로 2개의 인스턴스에 UPDATE 쿼리를 적용하고자 분산 트랜잭션을 시도하였습니다만 업데이트가 실패하고 오류가 발생하였습니다. 어떤 문제가 있었는지 아래와 같이 정리하였습니다.


[환경]
SQL Server 2008


[현상]
Linked Servers 에 등록된 서버에 분산 트랜잭션 쿼리를 수행하였으나 아래와 같은 오류가 발생합니다.

BEGIN DISTRIBUTED TRAN
      UPDATE [TblUser] SET age = 19 WHERE name ='라이고'
      UPDATE [.\LAIGOKR].[LAIGO].[DBO].[TblUser] SET age = 19 WHERE name = 'Lai Go'
COMMIT TRAN


OLE DB provider "SQLNCLI10" for linked server ".\LAIGOKR" returned message "Cannot start more transactions on this session.".
Msg 7395, Level 16, State 2, Line 3
Unable to start a nested transaction for OLE DB provider "SQLNCLI10" for linked server ".\LAIGOKR". A nested transaction was required because the XACT_ABORT option was set to OFF.


[원인]
분산 트랜잭션에서 업데이트 작업은 XACT_ABORT 옵션이 반드시 ON으로 설정되어 있어야 합니다. 기본값은 OFF로 설정되어 있습니다.


[해결방법]
분산 트랜잭션이 시작되기 전에 XACT_ABORT 값을 ON 으로 설정합니다. 이 설정을 ON으로 변경할 경우 지원하는 Provider 에 대해 모든 업데이트 작업을 허용합니다. 단, 런타임 오류가 발생할 경우 전체 트랜잭션이 종료된 후 롤백됩니다.

SET XACT_ABORT ON


[추가사항]
Distributed Transaction Coordinator 서비스가 시작되어 있지 않을 경우 아래와 같은 오류 메시지가 발생합니다.

Msg 8501, Level 16, State 3, Line 1
MSDTC on server 'LAIGO-PC' is unavailable.


[참고자료]
SET XACT_ABORT(Transact-SQL)
http://msdn.microsoft.com/ko-kr/library/ms188792.aspx


작성자 : Lai Go / 작성일자 : 2009.10.20

Posted by Lai Go