만일 데이터베이스가 단일 사용자 시스템이라면 여러분의 데이터베이스 애플리케이션 프로그램은 아무 제약없이 데이터를 추출하고 변경할 수 있습니다. 그러나 대부분은 수많은 사용자와 애플리케이션들이 하나의 특정 데이터베이스의 데이터를 추출하고 변경하고 있습니다.
이렇게 여러 사용자와 애플리케이션들이 동시에 같은 데이터를 읽고 쓰는 특징을 동시성(Concurrency)이라고 합니다. 각 데이터베이스 시스템은 이러한 동시성 문제를 해결하기 위한 제어 메커니즘을 제공해줘야 하는데, 이를 위해 트랜잭션이 나타나게 된 것이죠.
트랜잭션, All or Nothing
트랜잭션은 한 번에 처리돼야 할 하나 또는 두 개 이상의 일련의 작업의 묶음을 나타내는 논리적인 작업 단위로서, 하나의 트랜잭션에 포함되는 작업들은 모두 실행되거나 또는 모두 실행되지 않아야 합니다. 여러 개의 작업들이 하나의 명령으로서 처리돼야 하기 때문에 명령이 정상적으로 수행됐다는 것은 트랜잭션 내에 있는 모든 작업이 정상적으로 수행됐음을 의미합니다.
이 때 트랜잭션에 의해 변경된 내용은 데이터베이스 내에 반영돼야 합니다. 이러한 과정을 커밋(commit)이라 합니다. 그러나 명령이 수행되지 않았다는 것은 트랜잭션 내에 있는 특정 작업을 수행하는 데 실패했음을 의미합니다. 그렇게 되면 같은 트랜잭션 내에 포함되는 다른 작업 역시 수행되지 않아야 한다는 것입니다. 이 때는 트랜잭션을 시작하기 전 상태로 원상복구해야겠지요. 이러한 과정을 롤백(rollback)이라 합니다. 이를 위해 트랜잭션은 기본적으로 다음과 같은 'ACID' 특성을 갖습니다.
◆ A(Atomicity - 원자성) : 트랜잭션은 더 이상 분리할 수 없는 작업 단위로서, 하나의 트랜잭션에 포함된 작업은 하나의 명령처럼 모두 수행되거나 또는 모두 수행되지 않아야 합니다. 다시 말해서 트랜잭션에 여러 개의 작업이 포함돼 있더라도 이 작업들은 하나의 명령처럼 수행돼야 합니다.
◆ C(Consistency - 일관성) : 모든 트랜잭션은 공유되는 데이터베이스 내에서 새롭고 정상적인 상태를 만들거나 그 이전의 상태를 유지해야 합니다. 트랜잭션에 의해 발생된 데이터는 반드시 정확하고 믿을 수 있어야 합니다. 그리고 모든 애플리케이션은 데이터의 일관성에 대한 책임을 져야 합니다.
◆ I(Isolation - 분리성 또는 격리성) : 동시 트랜잭션에 의한 수정은 다른 동시 트랜잭션에 의한 수정과 격리돼야 합니다. 트랜잭션에서 다른 동시 트랜잭션이 수정하기 전 상태의 데이터를 보거나, 두 번째 트랜잭션이 완료된 후의 데이터를 볼 수는 있지만 중간 상태는 볼 수 없습니다. 결과적으로 시작 데이터를 다시 로드하고 일련의 트랜잭션을 재생해 원래 트랜잭션이 수행된 후의 상태로 데이터를 되돌릴 수 있는데, 이를 순차성이라고 합니다.
◆ D(Durability - 내구성 또는 영속성) : 한번 완료된 트랜잭션의 처리 결과, 즉 처리하면서 만들어낸 공유 자원에 대한 변화 내용은 장애에 대비해 반드시 저장돼야 합니다.
온라인 트랜잭션 처리
컴퓨팅 기술이 발전하고 산업이 발전하면서 기업 활동에서 발생하는 데이터의 양이 방대해지고, 은행·통신·증권·유통·인사·회계 등과 같은 대부분의 기업 환경에서 발생한 방대한 데이터를 처리하기 위한 트랜잭션의 중요성은 점차 높아지게 됐습니다.
또한 트랜잭션을 발생시킨 곳에서 메시지를 받아 이를 실시간에 처리해 그 응답을 돌려줌으로써 트랜잭션 처리에 소요되는 시간을 최소화하고 트랜잭션이 만들어낸 새로운 내용이 공유 자원에 적용되는 시간을 절약하기 위해 온라인 트랜잭션 처리(On-Line Transaction Processing, OLTP)가 나타났습니다.
온라인 트랜잭션 처리는 빠른 응답 시간과 확장성, 가용성과 장애시 복구 가능성, 완전성(Integrity), 보안성, 관리의 편이성이 뒷받침돼야 합니다. 온라인 트랜잭션 처리가 중요한 이유는 보다 빠른 정보의 습득 및 이용이 기업의 생존 여부를 결정하기 때문입니다.
따라서, 온라인 트랜잭션 처리를 위해 필요한 트랜잭션 스케줄링, 큐 관리, 고장 허용, 보완 및 정상 종료되지 못한 트랜잭션의 회복 기능 등을 지원하기 위한 TP 모니터(Transaction Processing Monitor)가 상용화되기 시작했습니다. TP 모니터는 트랜잭션 응용 프로그래머가 트랜잭션의 ACID 특성을 쉽게 구현할 수 있도록 도움을 주는 프로그램으로서, 시스템 자원의 할당을 관리하는 인터페이스와 프로시저로 이뤄져 있습니다.
트랜잭션의 ACID 돕는 TP 모니터
지난 92년까지는 유닉스용 TP 모니터 제품이 주류를 이뤘으나 93년 들어 메인프레임 업체에 의한 유닉스용 TP 모니터가 출시됐습니다. 이는 API를 메인프레임용 TP 모니터와 공통화해 메인프레임 애플리케이션을 그대로 유닉스에 이식할 수 있도록 하고 있는데, 한국IBM은 Encina/6000과 CICS/6000을 출시했고, DEC(컴팩에 합병됨)은 다음 버전의 ACMS에 유닉스판을 추가했습니다.
유닉스의 TP 모니터는 제품에 따라 미국 BEA의 Tuxedo 계열과 미국 Transarc의 Encina 계열(Transarc의 Encina 및 Encina/6000, HP의 Encina/9000 등), NCR의 TopEnd 계열, 메인프레임 업체를 중심으로 각사가 독자적으로 개발한 제품군(CICS/6000, TPS, BeTRAN 등) 등 크게 네 계열로 나눌 수 있습니다.


<그림 1>TP 모니터 구성요소
<그림 1>은 TP 모니터의 구성요소를 잘 보여주고 있으며, TP 모니터의 구성요소는 트랜잭션 요청 메시지 관리(MM), 요청 메시지를 적절한 응용 서버로 매핑시켜주는 네임서버(Name Server), 트랜잭션 서버간의 로드밸런싱(Load Balancing), 서버의 위치 투명성 제공 모듈(요청 제어), 응용(트랜잭션) 서버(AS) 관리, 원격 서비스 제공 모듈, 시스템 정보 관리 및 우선 순위 큐 관리, 제반 통신을 관리하는 모듈 등 총 6개의 모듈로 구성돼 있습니다.
이러한 상황에서, HTTP 프로토콜 기반의 웹이 발달하면서 기업의 모든 비즈니스는 웹 기반으로 이동하게 됐습니다. 이는 기존의 유닉스 또는 메인프레임 상에 구현된 TP 모니터를 기반으로 하는 레거시 시스템을 웹과 연동해야 하는 절대절명의 과제를 안겨줬습니다.
따라서 엔터프라이즈 컴퓨팅 기술의 쌍두마차인 J2EE(Java 2, Enterprise Edition) 플랫폼과 닷넷 플랫폼에서도 기존의 TP 모니터와 같은 트랜잭션 기반 시스템과 웹 기반 시스템을 연동하기 위한 기술이 필요했습니다. 이를 위해 J2EE 플랫폼에서는 JTA(Java Transaction API), JTS(Java Transaction Service)를, 닷넷 플랫폼에서는 MTS(Microsoft Transaction Server)를 재포장한 COM+를 제공하게 됐습니다.
J2EE 플랫폼을 위한 JTA/JTS
자바에서는 CORBA의 OTS(Object Transaction Service)에 기반해 트랜잭션을 관리합니다. 다시 말해서 OTS에 대한 자바 매핑으로서 JTS(Java Transaction Service)를 제공하고 있습니다. 이는 <그림 2>에 나타나 있는 트랜잭션 관리자(Transaction Manager)에서 담당합니다. 애플리케이션 또는 컴포넌트에서 직접 트랜잭션 처리에 참가하기 위해서는 UserTransaction 인터페이스를 사용할 수 있고, 애플리케이션 서버(컨테이너)에 맡기게 되면 TransactionManager 인터페이스와 리소스 매니저(리소스 어댑터)가 XAResource 인터페이스를 통해 트랜잭션을 관리하게 됩니다.

<그림 2>자바 트랜잭션 API(JTA,JTS,OTS)
XAResource 인터페이스는 2 단계 커밋(Phase commit)을 위한 표준 인터페이스 자바 매핑으로서, EIS(Enterprise Information System) 공급자는 이에 해당하는 네이티브 인터페이스를 제공합니다. 따라서 이를 이용해 리소스 어댑터를 구현함으로써 다양한 EIS를 통합할 수 있지요. 대표적인 리소스 어댑터는 JDBC 드라이버로서, 이는 대부분의 관계형 데이터베이스를 액세스할 수 있도록 해줍니다. 그리고 XA를 사용해 ERP 또는 CRM과 기업 애플리케이션, 메시지 큐, CICS와 같은 메인프레임 등의 다양한 EIS를 위한 트랜잭션을 관리합니다.
닷넷 플랫폼을 위한 MTS/COM+
MTS(Microsoft Transaction Server)는 COM(Component Object Model) 기반의 3 티어 애플리케이션을 개발하고 배치할 수 있도록 하기 위한 서버 중심 환경을 제공합니다. MTS 애플리케이션에서 애플리케이션 로직 컴포넌트는 서버 상의 MTS의 제어 하에 실행되고, DCOM(Distributed COM) 기술을 이용해 클라이언트 상에서 실행되고 있는 프레젠테이션 중심 컴포넌트에 의해 호출될 수 있습니다(<그림 3>).

<그림 3>닷넷 플랫폼을 위한 MTS/COM++
MTS라는 이름은 분산 트랜잭션을 실행하려는 회사만을 위해 만들어진 소프트웨어가 아니었기 때문에 혼동을 일으켰습니다. 윈도우 NT 서버를 대상으로 하는 미들 티어 개체는 트랜잭션에 포함돼 있든 아니든 간에 MTS 환경에서 실행돼야 하는데, MTS를 사용해 비 트랜잭션 개체를 배포할 수 있으므로 적잖은 혼란을 야기시켰지요. 윈도우 2000에서는 이러한 혼동을 없애기 위해 미들 티어 런타임 환경의 이름을 MTS에서 COM+로 변경했습니다. MTS에서의 트랜잭션 지원 기능은 COM+에도 포함됐고, MTS 사용 트랜잭션 프로그래밍 방법을 알고 있으면 COM+에서 트랜잭션 구성 요소를 작성하기 위해 그리 많은 수고를 하지 않아도 됩니다.
MTS의 가장 중요한 기능 중 하나는 트랜잭션 모니터로서의 역할이며, MTS/COM+ 환경에서는 마이크로소프트 분산 트랜잭션 코디네이터(DTC)를 트랜잭션 관리자 및 트랜잭션 코디네이터로 사용합니다. DTC는 두 개 이상의 데이터베이스, 메시지 대기열, 파일 시스템, 또는 기타 트랜잭션 보호 리소스 관리자를 통해 분산된 트랜잭션을 코디네이트하기 위해 마이크로소프트 SQL 서버에서 제공하는 서비스입니다. DTC는 OLE 트랜잭션 인터페이스를 통해 ACID 속성을 구현하고, 분산 데이터를 업데이트하는 응용 프로그램에 인터페이스를 제공합니다. MTS는 DtcGetTransactionManager 함수를 호출해 ITransactionDispenser 인터페이스를 얻고 ITransactionDispenser::BeginTransaction, ITransaction::Commit 및 ITransaction::Abort를 발급합니다. @
