본문 바로가기

DEVELOP/DB

트랜잭션(Transaction)

트랜잭션(Transaction)

- 데이터베이스의 상태를 변환시키는 하나의 논리적인 작업(예: 입금, 출금 등) 단위를 구성하는 연산들의 집합

 

예시) 계좌 입금 작업

1 계좌 잔고 확인(SELECT)

2 계좌 잔고에서 입금할 금액 더해서 저장(UPDATE)

3 계좌 잔고 다시 확인(SELECT)

 

=> 이 과정이 하나의 입금이라는 작업 단위를 구성한다.

 

트랜잭션의 ACID 성질

- Atomicity(원자성) : 트랜잭션의 모든 연산들은 모두 정상 수행되거나 모두 수행되지 않아야 한다.

  => 연산 중간 오류가 나거나 중지되면 이전 연산들도 모두 수행 취소되어야 한다.

- Consistency(일관성) : 트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.

  => 다양한 제약조건(constraints, cascade, trigger) 등을 유지해야 한다. (software level)

- Isolation(독립성) : 트랜잭션 수행시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장해야 한다.

- Durability(지속성) : 성공적으로 수행된 트랜잭션은 영원히 지속되어야 한다.

  => 전력문제, 시스템 문제, DB 일관성 체크 등에도 유지되어야 한다. (hardware level)

 

 

 

트랜잭션 격리(Isolation)

 

Isolation Level : 트랜잭션에서 일관성이 없는 데이터를 허용하는 수준

- Locking 개념 도입 

 => 트랜잭션이 DB를 접근하는 동안 다른 트랜잭션이 관여하지 못하게 막는다.

- 하지만 무조건적인 Locking은 모든 트랜잭션이 단일 스레드처럼 동작하게 하기 때문에 성능을 떨어지게 한다.

- 성능을 높이기 위해 Locking을 줄인다면 잘못된 값이 처리될 가능성이 있다.

 => 따라서, 효율적인 Locking 범위를 설정해야 한다.

 

1. Read Uncommited(Level 0)

 - Select 문장이 수행되는 동안 해당 데이터에 Locking 하지 않는다.

 - 즉, 트랜잭션이 처리중이거나 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.

  => 이는 아직 처리중인 데이터를 읽게되는 Dirty Read 문제가 발생할 수 있다.

 

2. Read Commited(Level 1)

 - Select 문장이 수행되는 동안 해당 데이터에 Locking이 걸린다.

 - 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 된다.

 - 다른 트랜잭션은 커밋이 완료된 데이터만 읽을 수 있다.

   => 한 트랜잭션이 데이터를 Read 하던 중,

        다른 트랜잭션이 해당 데이터에 접근하여 수정 또는 삭제한 뒤 커밋하면 

        기존 Read를 수행하던 트랜잭션은 수정된 데이터 또는 삭제된 데이터를 조회하게 되는 Non-Repeatable Read 문제가 발생할 수 있다.

- SQL server가 기본으로 사용하는 Isolation Level

 

3. Repeatable Read(Level 2)

 - 트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Locking이 걸린다.

 - 한 트랜잭션이 데이터를 Read할 때 다른 트랜잭션이 해당 영역의 데이터 수정이 불가능하다.

 - 즉, 트랜잭션이 범위 내에서 조회한 데이터의 내용이 항상 동일함을 보장한다.

   => 그러나 다른 트랜잭션에서 데이터의 추가, 삭제는 일어날 수 있기 때문에

        기존 트랜잭션이 다시 한번 Read를 수행했을 때

        새로운 데이터가 조회되거나 기존 데이터가 누락되는 Phantom Read 문제가 발생할 수 있다.

 

4. Serializable(Level 3)

 - 완벽한 읽기 일관성 모드 제공

 - 한 트랜잭션이 데이터를 Read할 때 다른 트랜잭션은 그 영역의 데이터 수정 및 입력, 삭제가 불가능하다.

 - 데이터 무결성을 유지할 수 있지만 동시성이 떨어질 수 있다.

'DEVELOP > DB' 카테고리의 다른 글

DB 면접 대비  (0) 2019.11.02
Persistence Framework  (0) 2019.10.14