ACID ❗

Lzhtk·2025년 6월 15일

오늘은 ACID를 알아보고 그중 격리성이 트랜잭션에 보장되지 않았을 경우 발생할 수 있는 문제와 이를 해결하기 위한 격리수준을 알아보자❗❕

ACID

  • ACID란 데이터베이스 트랜잭션에서 데이터 무결성과 일관성을 보장하기 위한 4가지 핵심 속성을 말한다.
    • 원자성( Atomicity ) : 트랜잭션은 모두 수행되거나 전혀 수행되지 않아야 하는 속성
    • 일관성( Consistency ) : 트랜잭션 실행 전과 후에 데이터베이스는 일관된 상태여야하는 속성
    • 격리성( Isolation ) : 동시에 여러 트랜잭션이 실행될 때, 각 트랜잭션은 독립적으로 실행된 것처럼 보여야하는 속성
    • 지속성( Durability ) : 트랜잭션이 커밋되면, 그 결과는 영구적으로 반영되어야 함.

격리성(Isolation) 👮

  • 그 중 격리성은 여러 트랜잭션이 실행될 때 서로의 중간상태에 영향을 받지 않도록 보장하는 성질이며 격리성이 보장되지 않을 시 발생할 수 있는 문제점에 대해 알아보자

    1️⃣ Dirty Read

    • 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 경우가 있을 수 있다.
      ex ) T1이 어떠한 값을 A=100 -> A=200으로 값을 변경 후 커밋 전에 T2가 A=200을 읽을 경우, 이후 T1이 롤백하면 T2는 잘못된 값을 읽는 경우.

    2️⃣ Non-Repeatable Read

    • 같은 쿼리를 두 번 수행했을 때 결과가 달라지는 경우가 있을 수 있다.
      ex) T1이 A=100으로 읽고, 이후 T2가 A=150으로 수정한 후에 커밋한 경우 T1이 다시 A를 읽으면 150으로 바뀐 경우.

    3️⃣ Phantom Read

    • 조건에 맞는 행의 수가 트랜잭션 도중 바뀌는 경우가 있을 수 있다.
      ex ) T1이 salary > 5000 조건으로 직원 수를 조회하였는데, T2가 새 직원을 삽입하고 커밋한다. 이후 T1이 쿼리를 다시 하면 결과가 다른 경우.

    4️⃣ Lost Update

    • 두 트랜잭션이 같은 데이터를 읽고 수정할 때 한 트랜잭션의 수정 결과가 덮어씌워지는 경우가 있다.
      ex ) T1과 T2가 동시에 A=100을 읽고 각각 A=A+10, A=A+20을 수행한다. 이후 T2가 마지막으로 커밋하면 T1의 변경은 무시된다.

트랜잭션 격리 수준🚫

  • 이를 해결하기 위해 SQL 표준에서 정의한 4가지 트랜잭션 격리수준을 알아보자.
    • READ UNCOMMITTED : 커밋되지 않은 변경사항도 읽을 수 있음
    • READ COMMITTED : 커밋된 데이터만 읽음
    • REPEATABLE READ : 트랜잭션 동안 읽은 데이터는 변경되지 않음
    • SERIALIZABLE : 가장 높은 격리수준으로 트랜잭션을 순차적으로 실행하는 것처럼 동작
  • 격리 수준을 강화할수록 데이터 일관성은 강해지지만, 동시성이 낮아져 성능 저하가 발생할 수 있으므로 설계 목적에 맞는 격리 수준을 선택해야 한다. 🌱
  • ex ) 실무에서는 보통 READ COMMITTED 또는 REPEATABLE READ를 사용하고 업데이트 충돌이 중요한 경우에 명시적으로 Lock를 사용해 보완한다.⛓

마무리 🔚

오늘은 데이터베이스 트랜잭션의 핵심 속성인 ACID와 그 중에서도 격리성이 보장되지 않았을 때 발생할 수 있는 문제들과 이를 해결하기 위한 트랜잭션 격리 수준에 대해 알아보았다.
시스템의 특성과 비즈니스 요구사항을 고려하여 무조건 높은 격리 수준이 아닌, 상황에 맞는 격리 수준을 선택하여 보자💯

0개의 댓글