데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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 보내진다. (해당 흐름에 대해서는 XeventDTC::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

No. Subject Author Date Views
2090 SQL Server DBA 체크리스트 jevida(강성욱) 2017.05.31 6717
2089 SQL Server 데이터베이스 백업이 성공적인지 확인하는 방법 jevida(강성욱) 2017.05.31 3729
2088 트리거가 적용된 메모리 최적화 테이블에서 alter table 실패 jevida(강성욱) 2017.05.31 3247
2087 메모리 최적화 테이블 변수 및 예상 행수 jevida(강성욱) 2017.05.31 2939
2086 백업 파일 복원과 3241 오류 (Microsoft® SQL Server® Backup to Microsoft Azure®Tool 사용) jevida(강성욱) 2017.05.31 3091
2085 In-Memory OLTP를 사용할 때 체크포인트 파일이 너무 많아 지는 이유 jevida(강성욱) 2017.05.31 2671
2084 메모리 최적화 테이블변수와 701 오류 (loop 사용으로 인한 메모리 부족 오류) jevida(강성욱) 2017.05.31 3334
2083 메모리 최적화 테이블에서 해시 인덱스 사용시 버킷 카운트의 중요성 jevida(강성욱) 2017.05.31 2936
2082 인덱스 리빌드시 병렬로 실행계획이 생성되지 않는 이유 jevida(강성욱) 2017.03.13 4927
2081 SQL Server 833오류 (15 Sec Slow IO Detected) jevida(강성욱) 2017.03.13 4294
2080 SQL Server nonpreemptive 모드에서Long Sync IO 오류 jevida(강성욱) 2017.03.13 3094
» SQL Server DTC Transaction의 SPID = -2 반환 jevida(강성욱) 2017.03.13 2394
2078 SQL Server Read/Writer 동기화 작동 원리 jevida(강성욱) 2017.03.13 2749
2077 SQL Server가 논리 및 물리 프로세서를 결정하는 방법 jevida(강성욱) 2017.03.13 2861
2076 데이터베이스에서 사용자 삭제 오류 jevida(강성욱) 2017.03.13 2788
2075 SQL Server ODBC Driver 및 Command package Tool 설치 jevida(강성욱) 2017.01.11 4761
2074 SQL Server Install on Linux (Ubuntu – 16.0.4) jevida(강성욱) 2017.01.11 4995
2073 SQL Azure blob storage 백업을 위한 프록시 세팅 jevida(강성욱) 2017.01.11 4197
2072 SQL on Azure 환경에서 SQL 서버 연결 불능 문제(VNET 설정 문제) jevida(강성욱) 2017.01.11 3285
2071 SQL Server 2016 자동 통계 업데이트 임계값 변경 jevida(강성욱) 2017.01.11 4524





XE Login