SQL Server/SQL Server Tip

의도하지 않은 분산트랜잭션 사용 - 응용프로그램 개발 시 동일한 객체를 사용하지 않아 분산 트랜잭션으로 승

SungWookKang 2015. 7. 23. 09:20
반응형

의도하지 않은 분산트랜잭션 사용

  • 응용프로그램 개발 시 동일한 객체를 사용하지 않아 분산 트랜잭션으로 승격

 

  • Version : SQL Server 2012

 

 

트랜잭션은 논리적 작업 단위로 결합되는 작업 그룹이다. 트랜잭션은 시스템에서 발생할 수 있는 오류에 관계없이 트랜잭션의 각 동작에 대해 일관성과 무결성을 제어하고 유지 관리하는데 사용된다.

 

로컬 트랜잭션은 트랜잭션이 1단계인 것을 말하며 데이터베이스에서 직접 처리 한다. JDBC 드라이버는 setAutoCommit, commit 및 rollback과 같은 SqlserverConnection 클래스의 다양한 메서드를 사용하여 로컬 트랜잭션을 지원한다.

 

분산 트랜잭션은 리소스 관리자라고 하는 둘 이상의 서버에 분산된다. 트랜잭션 관리는 트랜잭션 관리자라고 하는 서버 구성 요소에 의해 리소스 관리자 간에 조정되어야 한다. MSDTC(SQL Server 데이터베이스 엔진은 MSTSC) 등의 트랜잭션 관리자 또는 분산 트랜잭션 처리용 Open Group XA 사양을 지원하는 기타 트랜잭션 관리자에 의해 조정되는 분산 트랜잭션에서 리소스 관리자 역할을 한다.

 

다음 사례는 SQL Server Premier Field Engineer Blog에 게시된 내용으로 의도하지 않은 분산트랜잭션이 발생 한 경우이다. 필자가 읽고 이해한 내용을 정리하였으며 번역의 오류 및 기술적 오류가 있음을 미리 알려둔다. 자세한 내용은 원문을 참고 하길 바란다.

 

그들은 분산트랜잭션에 로컬트랜잭션을 추진하였다. 그들이 로컬 트랜잭션을 사용했던 이유는 여러 작업의 원자적 특성을 보장하기 위해서였다. 하지만 그들의 코드를 보면 SqlConnection을 재사용하였지만 SqlCommand 개체는 서로 다른 것을 사용하였다.

 

 

 

동일한 연결 문자열을 사용하였지만 두 sqlconnection 개체를 인스턴스화하고 별도의 개별 작업에 대한 sqlcommand,Connection 속성으로 설정된 객체를 사용함으로써 분산 트랜잭션으로 승진하는 트랜잭션을 유발하고 있다.

 

이 동작은 사용자가 원하는 동작은 아니었다. 이 문제를 수정하기 위해서는 모든 작업의 속성에 대해서 SqlConnection에 하나의 SqlCommand.Connetion 개체를 활용하는 것이다.

 

 

[참고자료]

 

 

 

 

2013-11-13 / 강성욱 / http://sqlmvp.kr

 

반응형