본문 바로가기

DB

[DB] 트랜잭션과 격리 수준

트랜잭션이란?

트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있으며, 트랜잭션에는 여러개의 연산이 수행될 수 있다. 그리고 트랜잭션은 아래 네 가지 원칙(ACID)가 반드시 지켜져야 한다.

원자성 (Atomicity)

처음에 언급했듯이 트랜잭션에는 여러개의 연산이 수행될 수 있는데 이 연산들이 모두 성공하거나 모두 실패해야 한다. 예를 들어 은행의 계좌 이체 서비스를 개발한다고 가정하면 하나의 계좌에서는 출금이 이루어져야 하고, 이체의 대상이 되는 계좌에는 입금이 동시에 일어나야 한다. 만약 출금에는 성공했는데 입금에는 실패한다면 결국 출금 계좌의 주인은 돈만 잃은 셈이 된다. 즉 한 트랜잭션 안에 있는 모든 연산이 성공했을때만 커밋(COMMIT)되어 데이터베이스에 영구히 저장되고 하나라도 실패한다면 한 트랜잭션 내에 포함된 모든 연산들이 전부 롤백(ROLLBACK)되어야 한다.

일관성 (Consistency)

모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 즉 허용된 방식으로만 데이터를 변경해야 하는 것을 의미하며 항상 데이터베이스에서 정한 무결성 제약 조건을 만족해야 한다. 예를 들어 통장에 0원이 있는데 다른 사람에게 500만원을 이체하는 것은 불가능하다. 만약 이체가 가능해버린다면 일관성을 해치는 것.

격리성 (Isolation)

동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 즉 트랜잭션으로 처리되는 중간에 외부에서의 간섭이 없어야 한다.

지속성 (Durability)

트랜잭션이 성공적으로 처리되면 그 결과는 영속적으로 보관되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.

무결성이란?

무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말한다.

이름 설명
개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다.
NULL 무결성 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건

격리 수준

트랜잭션은 원자성, 일관성, 지속성을 기본적으로 보장한다. 하지만 격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다. 격리 수준은 아래 네 가지가 있으며 READ UNCOMMITED가 격리 수준이 가장 낮고 아래로 갈수록 격리 수준이 높다. 그리고 격리 수준이 낮을수록 동시성은 증가하지만 격리 수준에 따라 다양한 문제가 발생한다.

READ UNCOMMITED

커밋되지 않은 데이터에 대한 읽기를 허용한다.

DIRTY READ, NON-REPEATABLE READ, PHANTOM READ 문제가 발생할 수 있다.

READ COMMITED

커밋된 데이터에 대해서만 읽기를 허용한다. 그렇기 때문에 DIRTY READ 문제는 발생하지 않지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할수 있어 NON-REPEATABLE READ 문제와 PHANTOM READ 문제가 발생할 수 있다.

MySQL8.0, PostgreSQL, SQL Server, 오라클 등 대부분의 데이터베이스들이 사용하는 격리 수준이다.

REPEATABLE READ

트랜잭션에 진입하기 이전에 커밋된 데이터에 대해서만 읽기를 허용한다. REPEATABLE_READ는 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없다. 하지만 새로운 행을 추가하는 것은 가능하다. 그렇기 때문에 DIRTY READ와 NON-REPEATABLE READ 문제는 발생하지 않지만 PHANTOM READ 문제가 발생할 수 있다.

SERIALIZABLE

SERIALIZABLE은 말 그대로 트랜잭션을 순차적으로 진행시키는 것을 말하며 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.

가장 엄격한 트랜잭션 격리 수준으로 DIRTY READ, NON-REPEATABLE READ, PHANTOM READ 문제는 발생하지 않지만 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준이다.

격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITED O O O
READ COMMITED X O O
REPEATABLE READ X X O
SERIALIZABLE X X X

격리 수준에 따른 문제점

  1. DIRTY READ : 아직 커밋하지 않은 데이터를 조회하는 문제
  2. NON-REPEATABLE READ : 한 트랜잭션 안에서 동일한 엔티티를 반복 조회 했을때 결과 값이 다르게 나오는 문제
  3. PHANTOM READ : 한 트랜잭션 안에서 일정 범위의 데이터를 조회했을 때 결과 집합이 다르게 나오는 문제

'DB' 카테고리의 다른 글

[DB] 인덱스 개념 및 원리  (2) 2023.08.15
[DB] 데이터베이스 정규화  (1) 2022.12.03