-
Transaction 이란
DB의 상태를 변환시키는 하나의 논리적인 작업 단위를 구성하는 연산들의 집합이다.
예를 들어, A계좌에서 B계좌로 일정 금액을 이체한다고 가정하자. 이러한 과정은 다음과 같다
a. A계좌의 잔액 확인
b. A계좌의 금액에서 이체할 금액을 빼고 다시 저장
c. B계좌의 잔액을 확인
d. B계좌의 금액에서 이체할 금액을 더하고 다시 저장
a~d의 과정들은 모두 합쳐저 계좌이체라는 하나의 작업단위(트랜잭션)을 구성, 트랜잭션은 항상 all or nothing 원칙을 만족해야 한다. 즉 완료를 하던가(commit) 다시 원래의 상태로 돌아가던가(rollback) 둘중 하나는 만족해야 한다. 절대 partoally Done 형태로 끝나서는 안된다.
-
트랜잭션의 성질(ACID)
-
Atomicity(원자성) , All or Nothing
트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
-
Consistency(일관성)
트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다. 예를 들어 계좌이체를 성공적으로 실행했다면 A계좌 잔액과 B계좌 잔액의 합이 트랜잭션 실행 전의 합과 동일해야 한다.
-
Isolation(독립성)
하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다. DB는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행된다. 이 때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다. 또한 트랜잭션이 실행중인 데이터는 다른 트랜잭션이 동시에 참조하지 못하도록 보장하여야 한다.
-
Durability(지속성)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다. 즉 완료된 트랜잭션의 결과는 디스크와 같은 보조기억장치에 저장되거나 시스템 장애가 회복되고 난 후에 어떠한 형태로든지 그 데이터를 복구 할 수 있어야 한다.
-
-
트랜잭션의 상태
-
트랜잭션과 DBMS
-
Concurrency Control(동시성 제어)
- 다중 프로그램의 이점을 활용하여 동시에 여러 개의 트랜잭션을 병행 수행시킬 때, 동시에 실행되는 트랜잭션들이 데이터베이스의 일관성을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어
- Lost update(갱신 손실)
- 하나의 값에 계속해서 Overwirte하여 데이터의 갱신이 무효화 되는 현상, 초기값 X = 1000이 있고, 트랜잭션 T1은 X +=300, 트랜잭션 T2는 X-=500 이라 할 때, 동시성 제어를 해주지 않으면 1000이라는 값이 T1에 의해 1300이 된 상태에서 T2가 아직 1300으로 Write 되기 전인 X=1000을 Read하여 1300-500이 아니라 1000-500이 수행되어 500을 갖게 되었고 T1과 T2가 순차적으로 값을 저장하여 덮어씌워지는 값의 손실을 갱신손실이라 한다.
- Inconsistency(모순성)
- 두 개의 트랜잭션이 병행 수행 될 때 원치 않는 자료를 이용함으로써 발생하는 문제
- 초기값 X=1500, Y=1000이 있고, 트랜잭션 T1은 X와 Y를 300 증가, 트랜잭션 T2는 X와 Y를 3배씩 증가시킨다고 합시다. 트랜잭션 T1이 수행될 때 X와 Y는 각각 1500과 1000이 읽혀야 합니다. T1이 수행되면서 X만을 1800으로 증가시키고 Write된 다음에 Y를 수행하는 것이 아닌 트랜잭션 T2가 수행된다고 합시다. 그러면 T2에 의해 X와 Y는 각각 5400과 3000이 되고 다시 T1의 Y가 Read를 해야하는 상황에서 1000이 아니라 3000이 읽히게 됩니다. 이렇게 어떤 값은 갱신 전의 값을, 다른 값은 갱신 후의 값을 읽어 데이터가 불일치하는 것을 모순성이라 합니다.
- Cascading Rollback(연쇄복귀)
- 연쇄복귀로, 복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우, 다른 트랜잭션이 처리한 부분에 대해 취소가 불가능한 현상.
- 트랜잭션 스케쥴
- 직렬 스케줄의 경우에는 트랜잭션의 연산을 모두 순차적으로 실행하는 유형, 즉 하나의 트랜잭션이 실행되면 해당 트랜잭션이 완료되어야 다른 트랜잭션이 실행
- 비직렬 스케쥴은 트랜잭션의 직렬 수행순서와 상관없이 병행 수행하는 스케쥴을 의미
- 직렬가능 스케쥴은 서로 영향을 주지 않는 직렬 스케줄을 비 직렬적으로 수행
- Lock
- 로킹기법 : 데이터 엑세스를 상호 배타적으로 하는 것
- 로킹 단위를 액세스 하기 전에 lock을 요청해서 lock이 허락되어야만 그 로킹 단위로 액세스 할 수 있다.
- 락은 읽기를 할 때 사용하는 공유락과 읽고 쓰기를 할 때 사용하는 배타락으로 나뉘어짐
- 로킹 단위가 크면 로크 수가 작아 관리하기 쉽지만 병행성이 낮아짐, 작으면 관리가 어렵고 병행성이 높아짐
- 2단계 락킹 : 트랜잭션들이 lock하는 시간과 unlock을 하는 시간을 구분하여 수행, 2단계 로킹 규약을 사용하지 않으면 아래의 그림과 같이 일관성이 위배되는 문제가 발생할 수 있습니다. 그래서 임의의 시간에 lock 또는 unlock을 하는 것이 아니라 확장 단계와 축소 단계를 두어 이를 해결해줍니다. 2PLP는 직렬 가능성을 보장할 수 있는 규약으로 가장 많이 사용되지만 교착상태가 발생할 가능성이 있지만 교착상태(데드락, Deadlock)에 빠질 수 있으므로 이를 해결해주어야 합니다.