본문 바로가기

STUDY/DATABASE

트랜잭션

트랜잭션이란 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법이다. 개념적으로 한 트랜잭션 내의 모든 읽기와 쓰기는 한 연산으로 실행된다.

트랜잭션의 핵심은 일련의 작업 도중 오류가 생기면 취소(abort, rollback)되고, 안전하제 재시도 할 수 있다는 것이다.

트랜잭션은 전체가 성공(commit)하거나 실패(abort, rollback)하므로 트랜잭션이 실패하면 애플리케이션에서 안전하게 재시도 할 수 있다. 즉, 트랜잭션 덕분에 부분적인 실패를 걱정할 필요가 없으므로 애플리케이션에서 오류를 처리하기 훨씬 쉬워진다.

ACID

트랜잭션은 ACID 속성을 가진다.

Atomicity - 원자성

여러 작업이 하나의 원자적인 트랜잭션으로 묶여있다. 트랜잭션 도중 어떠한 결함으로 인해 완료될 수 없다면 지금까지 실행한 작업을 무시하거나 취소해야 한다.

트랜잭션은 성공적으로 수행되면 commit되고, 하나라도 실패할 경우 abort혹은 rollback된다.

Consistencty - 일관성

트랜잭션은 데이터베이스 내부의 일관성을 지켜야 한다. 각 트랜잭션은 일관성을 보장하도록 프로그램을 작성한다.

Isolaction - 격리성

동시에 실행되는 트랜잭션은 서로 격리된 상태로, 트랜잭션은 다른 트랜잭션을 간섭 혹은 방해할 수 없다.

Durability - 지속성

트랜잭션이 성공적으로 커밋됐다면 하드웨어 결함이 발생하거나 데이터베이스가 죽더라도 트랜잭션에서 기록한 모든 데이터는 손실되지 않는다.

동시성 문제

동시성 문제는 트랜잭션이 다른 트랜잭션에서 동시에 변경한 데이터를 읽거나 두 트랜잭션이 동시에 같은 데이터를 변경하려고 할 때 나타나는 문제다.
이러한 동시성 문제는 트랜잭션 격리를 통해 해결할 수 있다. 일반적으로 트랜잭션 격리 수준은 네 가지로 나뉜다.

  • READ UNCOMMITED - 커밋되지 않은 읽기
    • dirty read 가능
  • READ COMMITED - 커밋된 읽기
    • dirty read 불가
    • 타이밍에 따라 데이터가 달라짐
  • REPEATABLE READ - 반복 가능한 읽기
    • 트랜잭션 내 모든 쿼리가 동일한 스냅샷의 데이터를 사용
    • 보통 MVCC(Multi-Version Concurrency Control)로 구현
  • SEARIALIZABLE - 직렬화 가능
    • 동시성 문제를 거의 해결할 수 있으나 성능상의 문제로 거의 사용하지 않음

참고로 SQL 표준에서 지정한 기본 격리 수준은 SEARIALIZABLE이며, MySQL InnoDB의 기본 격리 수준은 REPEATABLE READ다.