본문 바로가기
Skills/MsSQL

[Error] 연결된 서버 \"서버명\"의 OLE DB 공급자 \"공급자명\"에 대해 중첩 트랜잭션을 시작할 수 없습니다.

by Hoseok 2023. 9. 21.
728x90
반응형

 

{"연결된 서버 \"서버명\"의 OLE DB 공급자 \"공급자명\"에 대해 중첩 트랜잭션을 시작할 수 없습니다. XACT_ABORT 옵션이 OFF로 설정되어 있으므로 중첩 트랜잭션이 필요합니다.\r\n커밋할 수 없는 트랜잭션이 일괄 처리 맨 끝에서 검색되었습니다. 트랜잭션이 롤백됩니다.\r\n연결된 서버 \"서버명\"의 OLE DB 공급자 \"공급자명\"이(가) 메시지 \"이 세션에서는 트랜잭션을 더 이상 시작할 수 없습니다.\"을(를) 반환했습니다."}

 

연결된 서버에 접근해서 Insert하는 프로시저를 동작하는 과정에서 ASP.NET 서버 프로그램에서 발생한 에러이다.

 

SSMS(SQL Server Management Studio) 상에서는 잘 동작될 수도 있지만, 프로그램 상에서 발생할 수 있는 에러인데,

 

우선 해결방법부터 말하자면,

 

프로시저에,

 

SET XACT_ABORT ON

 

옵션을 명시하면 된다.

 


그럼 SET XACT_ABORT ON은 무엇일까?

 

SET XACT_ABORT ON:

SET XACT_ABORT은 트랜잭션 처리 동안 에러가 발생할 경우 어떻게 동작해야 하는지를 결정하는 옵션이다.


"SET XACT_ABORT ON"을 사용하면, 어떤 에러가 발생하더라도 트랜잭션을 자동으로 롤백한다. 

 

다시 말해, 트랜잭션 내에서 오류가 발생하면 해당 트랜잭션을 즉시 종료하고 이전에 수행한 모든 작업을 롤백한다.

 

이로 인해 데이터 일관성을 유지하고 데이터베이스의 무결성이 보장된다. 

 

만약 "SET XACT_ABORT OFF"로 설정하면,

 

일부 경우에 오류를 일으킨 Transact-SQL 문만 롤백되고 처리 작업을 계속한다.

 

그러나 SET XACT_ABORT 옵션을 OFF로 설정한 경우에도 오류 심각도에 따라 전체 트랜잭션이 롤백될 수도 있다.

 

참고로 T-SQL 문의 기본 설정은 OFF이고, 트리거의 기본 설정은 ON이다.

 

또한 구문 오류와 같은 컴파일 오류는 SET XACT_ABORT 옵션 설정으로 영향을 받지 않는다.

 


 

그렇다면 SET XACT_ABORT ON 은 필수 옵션일까?

 

SQL Server를 포함한 대부분의 OLE DB 공급자에 대한 암시적 또는 명시적 트랜잭션에서,

 

데이터 수정 문(INSERT, UPDATE, DELETE)에는 XACT_ABORT 옵션을 ON으로 설정해야 한다.

 

다만 공급자가 중첩 트랜잭션을 지원할 경우에만 이 옵션이 필요하지 않다.

 

즉, 하나의 트랜잭션 내에서 또 다른 트랜잭션을 시작하는 중첩 트랜잭션일 경우에만 해당 옵션을 off가 가능하다.

 

[SQL-SERVER 사용 시, 참고할 사항]

ANSI_WARNINGS=OFF인 경우 사용 권한 위반으로 인해 트랜잭션이 중단된다.

SET XACT_ABORT 옵션은 실행 시간 또는 런타임에 설정되며, 구문 분석 시에는 설정되지 않는다.

 


결론

 

결국 이 에러는, 분산 트랜잭션에서 SET XACT_ABORT OFF 옵션이 걸려 있어서 발생한 에러였다.

 

분산 트랜잭션은 여러 개의 서로 다른 데이터베이스나 서버 간에 걸쳐서 수행되는 트랜잭션을 의미한다.

 

각각의 데이터베이스나 서버는 독립적인 트랜잭션 관리 시스템을 가지고 있기 때문에,

 

분산 트랜잭션은 이러한 시스템 간에 데이터 일관성과 트랜잭션 무결성을 보장하기 위해 사용된다.

 

즉, 이러한 분산 트랜잭션일 때는 어떠한 에러가 발생하더라도 해당 트랜잭션을 자동으로 롤백하는 옵션이

 

필수적으로 요구된다는 것을 기억하자.

 

서버 설정을 통해 피해가는 방법도 있다고는 하지만 굳이 추천하지 않는다.

 

 

 

 

 

 

728x90
반응형