SQL Server DTC Transaction의 SPID = -2 반환
· Version : SQL Server
SQL Server에서 Session ID (SPID) 값이-2 인 경우는 SQL Server에서 DTC 트랜잭션이 활성화 중이지만 트랜잭션에 사용중인 세션이 없음을 나타낸다. 간단하게 시나리오를 정리하면 아래와 같다.
1. 클라이언트가 DTC트랜잭션을 생성하고 소유한다.
2. 클라이언트는 SQL Server에 연결하고 DTC 트랜잭션을 등록한다.
3. Connection은 DTC 트랜잭션의 일부 작업을 수행한다.
4. 클라이언트 연결이 끊어진다 .(또는 NULL로 등록)
현재 DTC 트랜잭션의 상태는 여전히 활성 상태이고 클라이언트가 DTC 트랜잭션을 커밋하지 않고 기본 연결을 유지한다. SQL Server는 연결이 종료되었으므로 트랜잭션을 중단하거나 커밋할 수 없다. 클라이언트는 다른 자원 관리자(파일 시스템,다른 데이터베이스 서버 등)를 등록 할 수 있으며 여전히 작업을 수행 할 수 있다. SQL Server를 쿼리할 때 활성 DTC 트랜잭션 (UOW)이 있지만 더 이상 트랜잭션과 연결된 연결이 없는 경우 세션ID(PSID)는 -2로 반환된다.
아래 설명은 위의 시나리오에 따라DTC 트랜잭션 흐름의 작동방식을 단계별로 설명한다.
1. 클라이언트가 DTC 트랜잭션을 생성하고 소유한다.
클라이언트는 제공된 DTC 인터페이스 중 하나를 사용하여ITransaction 개체를 생성한다. ITransaction을 생성하고 연결되면DTC 관리자는 ITrasanctionDispenser ->BeginTransaction 호출한다. 닷넷에서는 TransactionScope객체를 통해 이를 제공할 수 있다.
2. 클리어언트가 SQL Server에 연결하고 DTC 트랜잭션을 등록 한다.
클라이언트는 SQL Server 연결을통해 DTC 트랜잭션으로 등록/전파한다. 이를 수행하는 다양한 방법이 있지만 클라이언트는ODBC SqlDriverConnect, .NET Sqlconnection.Open 등을사용하여 SQL Server에 대한 연결을 설정한다. SQL Server는클라이언트가 DTC 관리자(들)와 SQL Server 동기화를 수행하도록 지시한다.
ITransaction에서 클라이언트 드라이버는 ITransactionExport 인터페이스를 사용하여 트랜잭션 쿠키를 내보낸다. 쿠키는 트랜잭션 UOW 및 DTC 관리자 끝점에 대한 정보를 나타내는 이진 값으로 SQL Server 인스턴스에서 사용하는 DTC 관리자와 다를 수 있다. 쿠키는 SQL Server로 보내진다. (해당 흐름에 대해서는 Xevent의DTC::Enlist 또는 DTC::Propagate 이벤트 사용한다.) SQL Server는 DTC 관리자와 트랜잭션 리소스 관리자로 등록할 수 있다. SQL Server는 제공된 쿠키를 사용하고ITransactionImport 인터페이스를 활용하여 트랜잭션을 나타내는 ITransaction 개체를 가져온다. 이 시점에서 클라이언트는트랜잭션에 대한 참조가 있는 ITransaction을 가지며 SQL Server에는 동일한 트랜잭션에 대한 참조가 있는 ITransaction이있다. SQL Server는저장된 ITransaction과 객체를 DMV를 통해서 출력할 수 있다.
3. Connection은 작업을 수행한다.
모든 트랜잭션 활동이 DTC 트랜잭션 엔티티와 올바르게 연관된다. 이 시점에서 클라이언트와 SQL Server에는 여전히ITransaction 참조가 있으며 연결은 DTC 트랜잭션에 바인딩 된 상태로 유지되며 잠금은 변경된 행에 보관된 상태로 유지된다.
4. 클라이언트 연결 끊기.
클라이언트는 SQL Server에서 연결을 끊을 수 있다. 연결이 끊어지거나 트랜잭션이 NULL로 전파될때 SQL Server는 추적중인 DTC트랜잭션에서 연결을 해제한다. 트랜잭션 개체는여전히 활성상태이므로 SQL Server의 트랜잭션 목록에 계속 남아있다. DTC 관리자는 중단 또는 커밋을 명령하지 않은 상태이다.
이 시점은 SQL Server에 DTC 트랜잭션에 바인딩된 세션이 없는 상태이다. DMV 쿼리를 실행하면 SQL Server는 트랜잭션개체와 연결된 세션을 조회하려고 시도한다. 활성 트랜잭션에 대해 세션이 없는DTC경우 SPID를 -2로 반환한다.
클라이언트는 추가 작업을 수행한 다음 ITransaction->Commit또는 중단을 발행할 수 있다. 커밋 또는 중단은 DTC 관리자가 처리하며 동일한 ITransaction(UOW)에 대한 모든 끝점에 연결하고 수행 할 작업을 나타낸다. SQL Server는 DTC 관리자로부터 커밋 또는 중단을 수신하고 적절한 단계를 수행하여 요청을 완료한다. 요청이 완료되면 SQL Server는 ITransaction 및 내부 추적 구조를 해제 한다.
Prepare, Prepared, Abort, Aborting 등과 같은 추가 DTC 이벤트를 사용하여 커밋 또는 중단을 추적할 수 있다.
[참고자료]
https://blogs.msdn.microsoft.com/bobsql/2016/08/04/how-it-works-sessionspid-2-for-dtc-transactions/
SQL Server, MS SQL, DTC, DTC Session, DTC Transaction, ITransaction, ODBC, .NET, SQLSetConnectAttr, xEvent, DMV, DTC Manager
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp