목차

1. 트랜잭션(Transaction)
2. 트랜잭션 격리수준(Transaction Isolation Level)
3. 동시성 제어(Concurrency Control)

 


1. 트랜잭션(Transaction) 개념

개념

트랜젝션이란 DBMS 에서 일관성과 무결성을 위해 사용하는 논리적인 작업 단위를 말하며, 좀 더 구체적으로는 하나 이상의 데이터베이스 작업(삽입, 검색, 수정, 삭제)를 묶어서 하나의 수행 단위로 묶은 것을 의미한다. 이렇게 하나의 트랜잭션이라는 단위로 작업을 함으로써 트랜잭션이 완료 되었다면 변경사항이 DB에 반영이 되고, 오류로 실패하였다면 수행한 작업에 대한 변경사항을 롤백하여 이전 상태로 복구시킨다. 

트랜잭션(Transaction): 하나 이상의 DB 작업을 묶어서 만든 하나의 논리적인 수행 작업
트랜잭션 성공 시 - 변경사항을 DB에 반영
트랜잭션 실패 시 - 수행한 작업으로 인한 변경사항을 이전 상태로 복구

 

 

예시

트랜잭션의 개념을 쉽게 이해하기 위한 예를 살펴보자. A가 B에게 1만원을 계좌이체를 하는 상황이다. 이 사건을 작업 단위로 나눠보면 아래와 같다.

A 가 B에게 1만원 계좌이체
1. A의 계좌 잔액을 1만원 감소시킨다.
2. B의 계좌 잔액을 1만원 증가시킨다.

 

위의 상황에서 1번 수행 후, 시스템 장애로 인해 2번이 수행되지 않는 경우 어떻게 될까? A의 통장에는 1만원이 감소하고, B는 1만원을 받지 못하는 문제가 발생한다. 중간에 돈이 휘발된 것이다. 이러한 문제를 해결하기 위해 두 작업을 하나의 수행 단위인 트랜잭션으로 묶는다. 트랜잭션 수행 시 1번 완료 후 시스템 장애가 발생한다면, 1번에서 변경한 상태(A 계좌 1만원 감소)를 이전 상태로 복구시킨다.

계좌이체 트랜잭션
1. A의 계좌 잔액을 1만원 감소시킨다.
2. B의 계좌 잔액을 1만원 증가시킨다.

 

위와 같이 여러 작업을 하나의 수행 단위로 묶어서 만든 하나의 DB 작업을 트랜잭션이라고 하며, 은행 업무· 결제 시스템 등에서 활용된다.

 

 

특징

이러한 트랜잭션은 4가지 특징을 가지며 각 특징의 앞글자를 따서 ACID라고 한다.

1. 원자성(Atomic): 트랜잭션에 포함된 작업들은 전부 수행되거나 전부 수행되지 않는다.

2. 일관성(Consitency): 트랜잭션 수행 전,후로 일관된 상태를 유지해야한다.

3. 고립성(Isolation): 트랜잭션 간 서로 영향을 미치지 않도록 관리해야한다.

4. 지속성(Durability): 트랜잭션 성공 이후에는 DB에 영구 반영되어야한다.

 

 

DBMS의 트랜잭션 지원

DBMS는 위의 트랜잭션 속성을 지원하기 위해 아래와 같은 기능을 지원한다.

1. 원자성(Atomic): 회복 관리자 프로그램 실행

2. 일관성(Consitency): 동시성 제어 알고리즘 & 무결성 제약 조건

3. 고립성(Isolation): 동시성 제어 알고리즘

4. 지속성(Durability): 회복 관리자 프로그램

 

 

트랜잭션 동작 과정

연산

- 커밋(Commit)
> 트랜잭션에 의해 수행된 변경사항을 DB에 영구적으로 반영하는 작업
> 커밋이 수행되었다면 트랜잭션의 모든 삽입,수정,삭제 작업이 DB에 영구 반영되며, 해당 변경사항은 롤백이 불가능하다.

- 롤백(Rollback)
> 트랜잭션에 의해 수행된 변경사항을 모두 취소하여 트랜잭션 수행 이전 상태로 돌아가는 작업
> 트랜잭션 실행 오류, 사용자의 의도적 실행 취소 등이 발생할 때 롤백이 수행됨

 

 

상태

1. Active
- 트랜잭션 실행이 시작된 상태이며, DB 에 대한 삽입,수정,삭제 작업을 수행하는 상태
- DB(하드디스크)에 영구반영되지 않은 상태이며, 주기억장치 버퍼에서 작업이 이뤄진다.

2. Partially Committed
- 트랜잭션의 마지막 작업까지 수행된 상태이며, 아직 DB에 영구 반영되지 않은 상태
- 커밋되기 바로 직전 상태이다.

3. Committed
- 트랜잭션의 변경사항이 DB에 영구반영된 상태이다.
- Commited 완료시 롤백할 수 없다.

4. Failed
- 트랜잭션 실행 중 오류로 인해 정상적으로 완료할 수 없는 상태
- 시스템 내부 오류, 무결성 제약 조건 위반 등 다양한 원인이 존재

5. Aborted
- Failed 상태의 트랜잭션에 대해 롤백을 수행하여 이전 상태로 되돌린 상태
- 필요시 트랜잭션을 재시작할 수 있다.

 

 

수행 과정

DBMS에서는 아래와 같은 처리 과정을 거쳐서 트랜잭션을 수행한다. 3번에서 보면 하드디스크에 영구 반영하기 전에 Commit 명령어를 수행한 것을 볼 수 있는데, 이는 사용자에게 빠른 응답을 보장하기 위함이다. 만약 3번 수행후 시스템 장애가 발생하는 경우 로그 및 복구 메커니즘을 통해 커밋된 변경사항을 복구한다.

DMBS 트랜잭션 수행과정
1. 하드디스크에서 주기억장치 버퍼로 데이터를 읽어온다.
2. 주기억장치 버퍼에서 작업을 수행한다(Active 상태)
3. 작업이 완료된 상태라면 Commit을 실행한다(Partially Commited 상태)
4. Commit 실행 이후에 주기억장치의 버퍼를 하드디스크에 저장한다(Commited 상태)

 

 


2. 트랜잭션 격리수준(Transaction Isolation Level) 

여러 트랜잭션이 동시에 실행되며, 한 트랜잭션이 수행되고 있는 동안 다른 트랜잭션이 같은 데이터에 접근하려고 할 때 문제가 발생하게 된다. 이러한 상황에 대해 어떻게 처리할지에 대한 정책을 트랜잭션 격리수준이라고 하며 4가지 격리수준이 존재한다.

 

4가지 격리수준

1. READ UNCOMMITED
2. READ COMMITED
3. REPEATABLE READ
4. SERIALIZABLE

 

 

1. READ UNCOMMITED

트랜잭션이 변경한 데이터를 커밋하기 전에 다른 트랜잭션에서 데이터를 읽는 것을 허용하는 정책이다. 즉, 아직 확정되지 않는 상태의 데이터를 읽을 수 있으며, 이를 Dirty Read 라고 한다. READ UNCOMMITED는 Dirty Read를 허용한다. 또한, 같은 트랜잭션 내에서 동일한 쿼리를 두 번 실행했을 때 다른 결과를 얻을 수 있다(eg. 트랜잭션 A 조회 >  트랜잭션 B 쓰기 > 트랜잭션 A 조회). 이를 Non-Repeatable Read 라고 한다. 

 

2. READ COMMITED

트랜잭션이 변경한 데이터를 커밋한 후에만 다른 트랜잭션들이 데이터를 읽을 수 있도록 허용하는 정책이다. 이전 READ UNCOMMITED에서 발생한 Dirty Read를 방지하지만, 여전히 Non-Repeatable Read 현상이 발생한다(eg. 트랜잭션 A 조회 >  트랜잭션 B 커밋 완료 > 트랜잭션 A 조회)

 

3. REPEATABLE READ

트랜잭션이 해당 데이터를 읽는 중에는 다른 트랜잭션이 변경하지 못하도록 하는 정책이다. 읽는 도중에 변경하지 못하게 하기 때문에 이전 수준에서 발생한 Non-Repeatable Read 현상을 방지한다. 하지만, 같은 트랜잭션 내에서 실행된 두 쿼리 사이에 새로운 데이터가 추가되는 Phantom Read가 발생할 수 있다( 읽고 있는 데이터에만 락이 걸리는것이기 때문에 해당 데이터를 수정 불가능. But 새로운 데이터를 추가 가능).

 

4. SERIALIZABLE

트랜잭션을 순차적으로 실행하는 정책이다. 이전 격리수준에서 발생한 Dirty Read, Non-Repeatable Read, Phantom Read 를 방지할 수 있으나 동시성이 크게 떨어진다는 단점을 가진다.

 

 

트랜잭션 격리 수준 정리

격리수준 4가지
1. READ UNCOMMITTED - 데이터 커밋 이전에도 조회가 가능
2. READ COMMITTED - 데이터 커밋 후에 조회가 가능
3. REPEATABLE READ - 데이터를 읽는 중에는 수정 불가
4. SERIALIZABLE - 순차적으로 트랜잭션을 실행


현상
* Dirty Read - 불완전한 데이터를 읽는 현상 | READ UNCOMMITED 
* Non-Repeatable Read - 같은 트랜잭션에서 동일한 쿼리 실행시 다른 결과를 얻는 현상 | READ UNCOMMITED, READ COMMITTED
* Phantom Read - 같은 트랜잭션 수행시 새로운 데이터 추가되는 현상 | READ UNCOMMITED, READ COMMITED, REPEATABLE READ

격리 수준과 동시성 제어는 Trade-Off 관계

 

 

3. 동시성 제어 메커니즘

트랜잭션 격리수준이 일관성과 무결성을 위한 정책이었다면 일관성과 무결성을 위한 아래와 같은 메커니즘이 존재한다.

1. 락(Lock)
2. 낙관적 동시성 제어(Optimistic Concurrency Control)
3. MVCC(Multi-Version Concurrency Control)

 

 

락(Lock)

운영체제에서 여러 스레드가 같은 자원에 접근했듯이, DB에서도 여러 트랜잭션들이 같은 데이터에 접근하는 상황이 존재한다. 이를 해결하기 위해 DB 락을 지원하며 크게 2가지의 DB락으로 나눈다. 

1. 공유락(Shared Lock)
- 데이터를 동시에 읽을 수 있도록 여러 트랜잭션에 부여되는 락
- 공유락이 걸린 경우 다른 트랜잭션들은 해당 데이터를 수정할 수 없다.

2. 베타락(Exclusive Lock)
- 데이터를 수정하기 위해 하나의 락에 부여되는 락
- 해당 데이터에는 다른 트랜잭션이 읽거나 수정할 수 없다.

 

 

낙관적 동시성 제어(Optimistic Concurrency Control)

동시에 데이터에 접근하는 상황이 드물다고 가정하고, 사전에 락을 걸지 않는 대신 커밋 이전에 데이터 변경 여부를 검사하는 방식이다. 만약 데이터 변경이 감지되었다면 해당 트랜잭션은 롤백된다. 

 

 

MVCC(Multi Version Concurrency Control, 다중 버전 동시성 제어)

데이터의 여러 버전을 가지고 동시성을 제어하는 메커니즘이다. 데이터의 수정이 일어났을 때 마다 버전을 하나씩 추가하며, 각 버전에는 타임스태프가 존재한다. 이렇게 함으로써 여러 트랜잭션들이 자신의 타임스태프에 맞는 버전을 읽음으로써 쓰기 작업과 상관없이 데이터를 읽을 수 있다. 이러한 MVCC는 MySQL, PostgreSQL 등에서 사용한다.

 

 


정리

* 트랜잭션(Transaction) : 일관성 및 무결성을 위한 DB의 논리적인 작업 단위

* 특징 - ACID
1. Atomicity(원자성): 트랜잭션 내의 작업들은 모두 수행되거나 모두 수행되지 않는다.
2. Consistency(일관성): 트랜잭션 실행 전,후가 일관적인 상태여야한다.
3. Isolation(고립성): 각 트랜잭션은 서로에게 영향을 미치지 않도록 한다.
4. Durability(지속성): 트랜잭션 성공시 DB에 영구 반영되어야 한다.

* 수행과정
1. 하드디스크로부터 관련 데이터를 주기억장치 버퍼로 읽어온다.
2. 버퍼를 통해 트랜잭션 작업을 수행한다.
3. 트랜잭션의 모든 작업이 완료되었다면 커밋을 수행한다.
4. 커밋 수행 후 버퍼의 데이터를 하드디스크에 저장한다.

* 트랜잭션 격리수준
1. READ UNCOMMITTED: 커밋하기 전 다른 트랜잭션에서 조회 가능
2. READ COMMITTED: 커밋이 완료된 후 다른 트랜잭션에서 조회 가능
3. REPEATABLE READ: 읽는 도중 다른 트랜잭션의 쓰기 작업을 제한
4. SERIALIZABLE: 순차적으로 트랜잭션을 수행
> 격리 수준과 동시성 제어의 Trade-OFF

* 동시성 제어
1. Lock: 공유락, 베타락을 사용
2. 낙관적 동시성 제어: 동시 접근이 가능성의 낮다고 가정하여, 커밋 이전에 데이터 변경 여부를 확인하는 방식
3. MVCC(다중 버전 동시성 제어): 데이터 변경 발생시 버전을 생성하여, 트랜잭션의 타임스태프에 맞는 버전에 대한 처리를 진행

 

 

 

 

[참고 링크]

https://mangkyu.tistory.com/30

https://mangkyu.tistory.com/299

https://coding-factory.tistory.com/226

https://goodmilktea.tistory.com/62

 

 

+ Recent posts