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

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

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

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

 

  • 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
1893 SQL Server 트랜잭션 로그 읽기 jevida(강성욱) 2016.10.12 2101
1892 MaxBCPThreads에 따른 BCP 병렬출력 jevida(강성욱) 2016.10.11 1090
1891 확장이벤트와 dm_os_wait_stats 대기유형 매핑 jevida(강성욱) 2016.10.11 1891
1890 장기 트랜잭션 확인 및 경고 설정 jevida(강성욱) 2016.10.11 1423
1889 SQL 데이터 수집툴 DiagManager 사용법 jevida(강성욱) 2016.10.11 1322
1888 Windows Server 2012 R2 그룹 관리 서비스 계정 및 SQL 서버 jevida(강성욱) 2016.10.11 1833
1887 Kerbros 구성 관리자 툴 jevida(강성욱) 2016.10.11 1161
1886 SQL Server Geography 및 Geometory 데이터 형식 jevida(강성욱) 2016.10.11 2401
1885 SQL Server를 이용한 신용카드 보안 -조직이 PCI DSS 준수를 달성 하기 위한 요건 jevida(강성욱) 2016.10.11 1364
1884 TDE 암호화 사용하기 jevida(강성욱) 2016.10.11 3324
1883 SQL Server 암호화 하기 jevida(강성욱) 2016.10.11 2739
» 의도하지 않은 분산트랜잭션 사용 jevida(강성욱) 2016.10.11 878
1881 Affinity I/O Mask jevida(강성욱) 2016.10.11 1168
1880 LPE_BATCH 스핀락 jevida(강성욱) 2016.10.11 882
1879 SQL Server 17953 오류 jevida(강성욱) 2016.10.11 985
1878 SQL 연결 18056 오류 jevida(강성욱) 2016.10.11 1362
1877 SQL 2008 R2 Sp1 적용과 9013 오류 - 포맷 섹터 크기에 따른 오류 jevida(강성욱) 2016.10.11 1816
1876 JDBC 로깅 파일 위치 설정 jevida(강성욱) 2016.10.11 958
1875 NUMA Node 메모리 블록 jevida(강성욱) 2016.10.11 1046
1874 AppDomain unloading 오류 로그 – CLR 오류 jevida(강성욱) 2016.10.11 1188





XE Login