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

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

 

  • 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 개체를 활용하는 것이다.

 

 

[참고자료]

 

 

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38129
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20673
1894 SQL Server에서 Drop 및 Delete 사용자 찾기 jevida(강성욱) 2016.10.12 1701
1893 SQL Server 트랜잭션 로그 읽기 jevida(강성욱) 2016.10.12 2284
1892 MaxBCPThreads에 따른 BCP 병렬출력 jevida(강성욱) 2016.10.11 1124
1891 확장이벤트와 dm_os_wait_stats 대기유형 매핑 jevida(강성욱) 2016.10.11 1965
1890 장기 트랜잭션 확인 및 경고 설정 jevida(강성욱) 2016.10.11 1523
1889 SQL 데이터 수집툴 DiagManager 사용법 jevida(강성욱) 2016.10.11 1386
1888 Windows Server 2012 R2 그룹 관리 서비스 계정 및 SQL 서버 jevida(강성욱) 2016.10.11 1890
1887 Kerbros 구성 관리자 툴 jevida(강성욱) 2016.10.11 1214
1886 SQL Server Geography 및 Geometory 데이터 형식 jevida(강성욱) 2016.10.11 2731
1885 SQL Server를 이용한 신용카드 보안 -조직이 PCI DSS 준수를 달성 하기 위한 요건 jevida(강성욱) 2016.10.11 1427
1884 TDE 암호화 사용하기 jevida(강성욱) 2016.10.11 3777
1883 SQL Server 암호화 하기 jevida(강성욱) 2016.10.11 2896
» 의도하지 않은 분산트랜잭션 사용 jevida(강성욱) 2016.10.11 970
1881 Affinity I/O Mask jevida(강성욱) 2016.10.11 1228
1880 LPE_BATCH 스핀락 jevida(강성욱) 2016.10.11 924
1879 SQL Server 17953 오류 jevida(강성욱) 2016.10.11 1061
1878 SQL 연결 18056 오류 jevida(강성욱) 2016.10.11 1477
1877 SQL 2008 R2 Sp1 적용과 9013 오류 - 포맷 섹터 크기에 따른 오류 jevida(강성욱) 2016.10.11 2035
1876 JDBC 로깅 파일 위치 설정 jevida(강성욱) 2016.10.11 1004
1875 NUMA Node 메모리 블록 jevida(강성욱) 2016.10.11 1091





XE Login