관계형 DBMS와 트랜적션 기능
트랜잭션의 개념
비즈니스적 측면 데이터베이스는 실제 비즈니스에서 발생하는 정보들을 저장 하고 관리한다. 그렇다면 비즈니스에서 트랜잭션은 무엇인가? 학교에서 수강신청, 은행 계좌이체, 온라인 쇼핑몰에서 구매 등이 모두 트랜잭션에 해당한다. 이와 같은 실제 비즈니 스 상에서 일어나는 트랜잭션 관련 데이터를 저장하고 기록하 는 것이 데이터베이스의 역할이다. 이제 비즈니스 트랜잭션의 특징에 대해 좀더 자세히 알아보 자. 예를 들어, 계좌이체의 경우 A라는 구좌에서 B구좌로 50 만원을 이체한다고 하자(A 구좌는 100만원 이상 예금되어 있 다고 가정). 이 계좌이체는 다음과 같이 두 가지 중요한 일을 수행한다.
. A 구좌에서 50만원을 빼고,
. B 구좌에 50만원을 더한다.
이 계좌이체 트랜잭션 과정은 50만원이 성공적으로 A 구좌 에서 B 구좌로 이동하든지, 아니면 아예 계좌이체가 일어나 지 않은 상태로 되어야 한다. 즉 트랜잭션을 이루는 두 가지일이 모두 성공적으로 발생하든지, 또는 하나도 발생하지 않 아야(all-or-nothing) 정상이다. 다시 말해 은행도 개인도 손 해를 보지 않아야 한다. 만일 A 구좌 고객이 ATM 단말기에 서 계좌이체를 수행하다 문제가 발생해서 첫 번째 일만 수행 하고, 두 번째 일을 수행하지 못했다면 은행만 50만원을 벌게 되는 결과가 된다. 따라서 트랜잭션은‘하나의 정상적인 상태 (이 예의 경우 A, B 두 구좌 모두 정확한 잔고가 남아 있는 상 태)에서 또 다른 정상적인 상태(A-50, B+50)로 전이하는 논 리적인 일의 단위(a logical unit of works)이다. 논리적으로 정상적인 상태에서 다른 정상적인 상태로 바꾸는 논리적인 일 의 단위가 바로 비즈니스 측면에서의 트랜잭션을 의미한다.
기술적인 측면
실제 비즈니스 트랜잭션의 전후 데이터 값을 저장/관리하는 것이 데이터베이스의 역할이다. 그렇다면 이와 같은 비즈니스 트랜잭션을 제대로 지원하기 위해 S/W 기술적인 측면에서 트랜잭션 기술은 어떤 특징을 가져야 할 것인가? 이를 위해 기술적으로 데이터베이스의 트랜잭션 기능은 다음과 같은 네 가지의 중요한 성질을 제공할 수 있어야 한다. 이 네 가지 성 질을 줄여서(기술적인 측면에서) 트랜잭션이 만족해야 할 ACID 속성이라고 한다.
◆ 원자성(Atomicity) :
이 성질은 비즈니스 측면에서 트랜잭션의‘all-ornothing" 성질을 기술적으로 보장하기 위해 필요하다. 즉 데이터베이스 값은 하나의 트랜잭션을 이루는 개별 작업들이 모두 다 성공적으로 끝나든 지, 아니면 하나도 발생하지 않은 상태로 복원돼야 한다. 앞의 계좌이체를 예로 들면, 데이터베이스는 어떤 경우든지 A 구좌에서 100만원이 빠지고, B에는 변동이 없는 경우는 없어야 한다. 만일 계좌이체 중간에 데이터베 이스 시스템의 전원이 나가는 경우에도 다시 복구(recovery)를 수행하면, 데이터베이스 내의 A 구좌와 B 구좌는 해당 트랜잭션이 발생하기 전의 상 태로 돌려져 있어야 한다.
◆ 일관성(Consistency) :
이 성질은 비즈니스 측면의 트랜잭션 개념이 데이 터베이스를 하나의 정상적인 상태에서 또 다른 정상적인 상태로 바꾸는 것 과 관계가 있다. 기술적인 측면에서 트랜잭션의 일관성에 대한 책임은 비 즈니스 측면의 계좌이체를 정확히 응용 프로그램으로 구현하는 프로그래 머에게 있다. 예를 들어, 계좌이체의 경우 트랜잭션 수행 전의 A, B 구좌 의 잔액의 합이 수행 후에도 동일하도록 프로그램을 작성해야 한다.
◆ 지속성(Durability) :
이 성질은 일단 트랜잭션의 처리가 정상적으로 끝나 고 나면, 이후에 시스템 오류가 발생하는 경우에도 해당 트랜잭션의 결과 가 데이터베이스에 보장돼야 한다는 것이다. 예를 들어, 계좌이체의 경우 ATM 단말기에서 A가 성공적으로 계좌이체가 끝났다는 전표를 받아든 이후에, 비록 데이터베이스 시스템의 전원이 나가는 경우에라도 반드시 복구 해서 계좌이체가 끝난 후의 상태를 보장해야 한다는 것이다.
동시성 접근에 따른 이상 현상
◆ 독립성(Isolation) :
데이터베이스는 기본적으로 여러 사용자가 동시에 데 이터를 접근해서 사용할 수 있다. 각 트랜잭션에 대해 기술적으로 원자성, 일관성 그리고 지속성이 보장된다 하더라도, 이러한 동시 사용 (concurrent access)으로 인해 여러 사용자가 동시에 같은 데이터를 접 근하면 예기치 않은 결과가 나올 수 있다. 예를 들어, A구좌에서 B 구좌로 의 계좌이체 트랜잭션 T1의 중간에(좀더 정확히는 A 구좌에서는 50만원 이 빠져나가고, B에 50만원을 더하기 전에), 다른 트랜잭션 T2가 은행 전 체 구좌의 잔고 합을 구하기 위해 A 구좌와 B 구좌의 잔고 값을 읽는다면, T2는 50만원이 부족한 결과를 얻게 된다. 이는 T2가 T1의 중간 상태의 값을 읽었기 때문에 나타나는 현상이다. 그렇다면 T2가 정상적인 결과 값 을 구하기 위해 기술적으로 데이터베이스에서 보장해야 할 일은 무엇인 가? T2가 T1의 시작 전 상태의 A, B 구좌 값을 읽거나, T1이 종료된 후 의 A, B 구좌 값을 읽도록 해야 한다. 마치 T2-T1 또는 T1-T2의 순서로 트랜잭션이 동시가 아니라 순차적으로 수행된 것처럼 데이터베이스 상태 를 보장해야 한다. 네 가지 트랜잭션의 기술적인 성질을 보장하기 위해 상용 관계형 DBMS들은 트랜잭션 관리자 모듈을 포함하고 있다. 트랜잭션 관리자는 크게 동시성 제어 모듈과 회복 모듈을 갖 고 있다. 동시성 제어 모듈은 같은 데이터에 대한 동시 접근으 로 인해 발생할 수 있는 문제를 방지하기 위한 모듈(다시 말 해, 주로 독립성을 보장)이고, 회복 모듈은 시스템의 오류로 부터 원자성과 지속성을 보장하는 역할을 한다.