BOBO's Note

Transaction Processing 본문

Database

Transaction Processing

bobo_hee 2020. 7. 21. 23:54

Transaction

트랜잭션은 DBMS의 데이터베이스를 접근하고 업데이트하는 프로그램 실행의 단위이다. 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 일련의 연산 집합으로서 작업의 단위이다.

 

트랜잭션은 여러 연산을 실행하지만, DBMS의 입장에서는 데이터베이스의 데이터를 READ/WRITE하는 연산만 중요하다.

많은 사용자의 동시 접근을 위해 트랜잭션을 concurrent하게 처리해주어야 한다.

 

ACID rules

데이터 무결성을 보장하기 위해 트랜잭션이 갖추어야 할 4가지 속성이다. 

  • Atomicity: 트랜잭션의 모든 연산은 완전히 반영되거나, 아예 반영되지 않아야 한다. (all or nothing)
  • Consistency: 트랜잭션이 완료되면 언제나 일관성 있는 상태여야 한다. 트랜잭션을 실행하기 전과 후의 시스템의 고정 요소 상태가 같아야 한다.
    • A계좌와 B계좌의 합이 25,000원이라면, A계좌→B계좌로 5,000원을 송금한 후에도 두 계좌의 합이 25,000원이어야 한다.
  • Isolation: 동시에 일어나는 다른 트랜잭션에 의해 영향을 받지 않아야 한다. 여러 트랜잭션이 동시에 수행되어도 그 결과는 순차적으로 실행된 결과와 같아야 한다.
  • Durability: 완료된 트랜잭션의 결과는 영구적으로 보존되어야 한다.

 

Transaction Status

트랜잭션은 5가지 상태에 놓일 수 있다.

Transaction Status

트랜잭션이 실행되면 active 상태에 놓인다. 이때 트랜잭션의 마지막 연산까지 수행하면 partially committed 상태가 된다. 이 상태는 아직 COMMIT 연산, 즉 트랜잭션에서 변경한 내용을 데이터베이스에 반영하지 않은 상태이다. 이후 COMMIT 연산까지 하게 되면 committed 상태가 된다.

 

한편, 트랜잭션을 수행하던 도중 오류가 발생되어 중단되면 failed 상태가 된다. 트랜잭션에서 수행한 모든 변경 작업을 취소하고 트랜잭션 이전 상태로 되돌리는 ROLLBACK 연산을 한 후, aborted 상태가 된다. aborted 상태는 트랜잭션이 비정상적으로 종료되어 ROLLBACK 연산을 수행한 상태이다.

 

Conflicting Operation

충돌 연산이란, 같은 데이터에 대한 두 개의 연산 중 적어도 하나가 WRITE인 경우를 의미한다.

  • WR 충돌
  • RW 충돌
  • WW 충돌

 

Conflict Serializability

interleaved schedulte에서 충돌 연산의 수행 순서가 serial schedule에서의 순서와 같으면 conflict serializable하다고 한다. 충돌 연산의 수행 순서를 그래프로 나타내어 conflict serializable한지 확인할 수 있다.

Conflict Serializability Testing Graph

Conflict serializable한 스케쥴은 항상 동시성과 일관성을 보장한다. Conflict serializable하지 않은 스케쥴의 경우, Two-Phase Locking 또는 Timestamp Ordering을 이용해서 직렬성을 보장할 수 있다.

 

Locking

lock이란 어떤 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근하지 못 하도록 막는 것을 의미한다. 데이터에 접근하기 전에 lock을 요청하여 허락받은 후 접근해야 하고, 이후 unlock하여 lock을 반환해야 한다.

 

locking의 단위가 크면 관리가 쉽지만 병행성이 낮아진다. 반대로 locking의 단위가 작으면 관리가 어렵고 locking 오버헤드가 증가하지만, 병행성이 증가한다.

 

lock에는 2가지 종류가 있다.

  • Shared Lock (S-Lock): 하나 이상의 트랜잭션이 얻을 수 있다. 데이터를 읽기 전에 얻어야 하는 lock으로 Read-Lock이라고도 한다. S-Lock을 가진 트랜잭션이 있을 때엔 다른 트랜잭션에서 X-Lock을 얻지 못 한다.
  • Exclusive Lock (X-Lock): 오직 한 트랜잭션만 얻을 수 있다. 데이터를 쓰기 전에 얻어야 하는 lock으로 Write-Lock이라고도 한다. X-Lock을 가진 트랜잭션이 있을 때엔 다른 트랜잭션에서 X-Lock 뿐만 아니라 S-Lock도 얻지 못 한다.

 

Two-Phase Locking (2PL)

모든 트랜잭션이 필요한 lock을 모두 얻은 후에 unlock하는 방법이다. 즉, lock과 unlock을 2단계로 수행한다.

  1. Growing(=Locking) Phase: 새로운 lock을 얻는 구간으로, 해당 구간에서는 어떠한 lock도 해제할 수 없다.
  2. Shrinking(=Unlocking) Phase: 얻은 lock을 모두 해제하는 구간으로, 해당 구간에서는 어떠한 lock도 새로 얻을 수 없다.

Two Phase Locking

2PL은 항상 직렬성을 보장하지만, lock을 얻는 순서에 따라 데드락이 발생할 수 있다는 단점이 있다. 데드락을 예방하기 위해서는 모든 트랜잭션에서 lock을 얻는 순서를 같게 해야 한다.

Deadlock 예제

위의 예제에서 T1의 경우 lock을 B→A 순서로 얻는다. T2에서는 A→B 순서로 얻는다. 따라서 데드락이 발생할 수 있다. 모든 트랜잭션에서 A→B 또는 B→A 순서로 lock을 얻도록 하면 데드락이 발생하지 않는다(데드락 발생 조건 중 circular wait 만족 X).

 

한편 많은 데이터에 접근해야 하는 경우, lock을 모두 얻어야 하므로 병행성이 낮아진다는 문제점도 있다.

 

Timestamp Ordering

타임 스탬프 순서 기법은 READ/WRITE 하기 전에 타임 스탬프를 부여하고, 타임 스탬프 순서에 따라 트랜잭션 작업을 수행하도록 하는 방법이다. 이 방법은 직렬성을 보장하며 데드락이 발생하지 않는다.

  • Wait-Die: 오래된 트랜잭션은 lock이 해제되기를 기다릴 수 있지만, 새로운 트랜잭션은 rollback되어 lock을 반환한다. Non-Preemtive한 방식이다.
  • Wound-Wait: 새로운 트랜잭션은 lock이 해제되기를 기다릴 수 있지만, 오래된 트랜잭션은 새로운 트랜잭션을 강제로 rollback 시키고 자신이 lock을 점유한다. Preemptive한 방식이다.

'Database' 카테고리의 다른 글

SQL (1)  (0) 2020.07.13
ER to Relational Schema  (0) 2020.07.09
Relational Algebra  (0) 2020.07.09
Relational Model  (0) 2020.07.08
MapReduce  (0) 2020.07.02
Comments