소프트웨어/C# & ASP.NET

닷넷 트랜잭션 정리

falconer 2008. 7. 18. 08:32

개인적인 필요에 의해 정리를 해 보았습니다....

COM+ 트랜잭션 특징
1. 트랜잭션 속성을 지정하는 단위가 메소드가 아닌 클래스이다.
2. Nested Transaction을 지원한다.
3. 항상 DTC (Distributed Transaction Coordinator)와  IPC 통신을 하며 2PC 처리를 하기 때문에 성능 저하가 있다.

System.Transactions의 특징
1. LTM (lightweight Transaction Manager)와 OTM (OleTx Transaction Manager)로 구성되며, 로컬 트랜잭션 사용시 LTM 이, 분산 트랜잭션 사용시  OTM이 관여하는데, 사용자가 지정하는 것이 하니라 자동으로 promotion 된다.
2. RM (Resource Manager, 예, DBMS)가 하나의 경우 LTM이 DTC와 무관하게 로컬 트랜잭션으로 처리하기 때문에 성능 저하가 없다. 이는 LTM의 경우 트랜잭션 관리는 등록되어 있는 RM의 기능을 호출하여 처리하고 모니터링 하는 것이 전부이기 때문에 특별히 부하가 걸릴 이유가 없어서 성능 저하가 거의 없다.
3. RM이 둘 이상 등록이 되는 순간 LTM이 관리하던 로컬 트랜잭션이 OTM 영역으로 promotion이 되어 분산 트랜잭션으로 처리가 된다. 이 경우 DTC가 관여하여 2PC로 처리하게 된다.
4. 이와 같이 RM이 하나일 때 로컬 트랜잭션, 둘 이상일 때 분산 트랜잭션으로의 promotion을 자동으로 지원하기 위해서는 RM이 IPromotableSinglePhaseNotification을 구현하고 있어야 하는데, 현재까지 이를 구현한 데이터베이스로는 SQL Server 2005/2008이 있다. 다른 데이터베이스의 경우 이 같은 기능이 없기 때문에 항상 promotion이 일어나서 DTC가 관여하여 오버헤드가 발생하게 된다.

.NET 트랜잭션 처리 방법
1. .NET 1.x
    프로그래밍 방식 : 데이터테이스의 트랜잭션 기능을 직접 프로그래밍적으로 호출하여 사용하며 로컬 트랜잭션이다. 선언적으로 로컬 트랜잭션을 사용할 방법이 없다.
    선언적 방식 : System.EnterpriseServices를 이용하여 선언적으로 사용하며 분산 트랜잭션이다. 이 경우 항상 DTC가 관여하여 성능 저하가 유발된다.
2. .NET 2.0
    프로그랭밍 방식 : System.Transaction의 TransactionScope를 이용하여 트랜잭션 범위를 지정하며 마지막에 Complete()을 호출하여 commit한다. 로컬 / 분산 트랜잭션
     선언적 방식 : System.EnterpriseServices를 통해 예전처럼 선언하여 사용하게 되면, 내부적으로는 System.Transaction이 적용된다. 로컬 / 분산 트랜잭션
3. .NET 3.x
     프로그래밍 방식 : 위와 동일. System.Transaction의 TransactionScope 이용. 로컬 / 분산 트랜잭션
     선언적 방식 : System.Transaction의 TransactionScope를 원하는 메소드의 attribute에 지정하여 사용. 로컬 / 분산 트랜잭션

MS DTC (Microsoft Distributed Transaction Coordinator)의 특징
DTC (Distributed Transaction Coordinator) 는 분산 트랜잭션시 중간에서 트랜잭션을 관리하는 Microsoft의 TP (Transaction Processing) Monitor라 할 수 있으며 흔히 하는 말로 TM (transaction manager) 역할을 한다. 그리고 OLE 트랜잭션을 통한 분산 트랜잭션 뿐만 아니라 X/Open의 DTP (Distributed Transaction Processing) 기반의 분산 트랜잭션 (흔히, XA-compliant 트랜잭션)을 모두 지원하는 transaction manager이다. 아울러 DTC는 XA-compliant한 resource manager (RM) 역할도 할 수 있다. 즉, DTC XA Mapper를 통해, XA를 지원하지 못하고 Ole 트랜잭션만을 지원하는  RM들을 XA-compliant한 RM으로 매핑하여 XA기반 분산 트랜잭션에 참여할 수 있는 방안을 제시한다.
아래 표는 드원 테크놀로지의 유경상 수석이 자신의 블로그에 정리한 것이다.
image 
표 에서 보듯이, 접근할 수 있는 방법이 크게 ODBC Data Provider (System.Data.Odbc), OleDB Data Provider (System.Data.OleDb), Managed Data Provider (System.Data.OracleClient), 오라클이 제공하는 ODP.NET Data Provider (Oracle.DataAccess.Client) 등이 있다. 이 중에서 분산 트랜잭션을 지원하는 방식을 보면 Microsoft가 제공하는 방식은 ODBC와 OleDb provider의 경우 XA-compliant한 데 반해, Oracle에서 제공하는 방식은 Ole Tx를 따르고 있다. ODBC나 OleDb의 경우는 예전 방식에 bridge를 하는 경우이기 때문에 성능면에서나 추천할 만한 것은 못된다.
현 시점에서 Oracle 10g/11g를 분산 트랜잭션으로 묶는 방법은 결국 System.Transaction을 써서 오라클이 제공하는 ODAC (Oracle Data Access Component) 중에 함께 배포되는 Oracle Services for MTS (Ora MTS)를 이용하는 것이다. Windows XP와 Windows Server 2003의 경우 System.Transaction과 함께 쓸 수 있는 (즉, DTC가 사용할 수 있는 Ora MTS)이 있기 때문에 가능하나, Vista와 Windows Server 2008의 경우 System.Transaction을 써서 분산 트랜잭션을 지원할 Ora MTS가 아직 나와 있지 않은 실정이며, 오라클 싸이트의 각종 문서나 온라인 상의 포럼 등을 찾아봐도 많은 개발자가 나올 날을 손꼽아 기다리고 있는 형편이다.
http://www.oracle.com/technology/software/tech/windows/odpnet/install11106.html
http://www.oracle.com/technology/software/tech/windows/odpnet/install10202.html


안 쪽까지 속속들이 보지는 못했지만, 지금껏 드는 느낌은 WCF가 닷넷 분산 개발의 통일된 개발 패턴을 가져가서 혁신을 가져왔듯이 트랜잭션 면에서도 깔끔하게 정리가 되었으면 하는 바람이다. (Ole 트랜잭션을 없애면 않되는 것일까 ?) 자바는 일찍이 Corba의 OTS (object transaction service)를 본 따서 JTS (Java Transaction Service)를 만들어 자체 표준으로 삼고 이를 벤더가 WAS내에서 구현하도록 하고 이를 사용할 인터페이스로 JTA (Java Transactin API)를 두어 servlet에서든, ejb에서든 선언적이든 프로그래밍적이든 일관된 방식으로 개발할 수 있도록 하고 있다. 또한  자바에서 표준화된 분산 트랜잭션은 X/Open의 DTP 방식 즉, XA-compliant 방식만을 지원하기 때문에 오히려 심플하다. 하지만 닷넷의 System.Transaction에서처럼 RM이 추가되는 것에 의해 로컬 트랜잭션에서 분산 트랜잭션으로의 promotion 기능은 없으며 데이터베이스 커넥션 풀을 만들때 로컬 트랜잭션용, 분산 트랜잭션용 따로 만든다. 물론 이때 사용되는 드라이버는 로컬 트랜잭션용일때와 분산 트랜잭션용일때 다르다.


출처 : http://hoons.kr/MetaBlog/Contents.aspx?blogIdx=2138