ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션과 격리 수준 (Isolation Level)
    개발/DB 2022. 12. 30. 15:38

    트랜잭션(Transaction)이란?

    • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
    • SELECT, INSERT, DELETE, UPDATE (SQL) 하나만을 의미하는게 아니다. 하나의 작업에는 여러개의 질의어가 포함될 수 있다.

     

    트랜잭션의 특징

    • ACID
      • 원자성 (Atomicity) 
        • 데이터베이스에 모두 반영되던가 (commit), 모두 반영되지 않던가 (rollback,aborted)
      • 일관성 (Consistency) 
        • 트랜잭션의 작업 처리 결과가 항상 일관성 있어야 한다.
        • 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도, 업데이트 이전의 데이터베이스에 트랜잭션이 진행됨으로써 일관성 있게 데이터를 처리한다.
      • 독립성 (Isolation)
        • 둘 이상의 트랜잭션이 동시 실행 되고있는 경우, 하나의 트랜잭션이 완료될 때 까지, 다른 트랜잭션이 해당 트랜잭션의 결과를 참조할 수 없다.
      • 지속성 (Durability)
        • 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.

     

    트랜잭션 격리 수준 (Isolation Level) 이란?

    • 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 서로 얼마나 고립되어 있는지를 나타내는 것.
    • 즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정

    격리 수준간 차이

    • 격리 수준은 아래 4개로 나뉜다. 아래로 갈수록 격리 수준이 높아지며, 성능이 떨어진다.

    1. READ UNCOMMITTED

    • 트랜잭션 진행간, Commit 되지 않은 데이터를 참조하여 트랜잭션을 진행한다.
    • Dirty Read 문제가 발생할 수 있다.
      • 1. A 트랜잭션에서 A 테이블의 데이터를 수정중인 상태 (Commit 전)
      • 2. B 트랜잭션에서 A 테이블의 데이터를 조회 (Commit 전이지만 A 트랜잭션에 의해 수정된 데이터를 조회해옴.)  -> Dirty Read
      • 3. A 트랜잭션에서 문제가 발생해 Rollback
      • 4. B 트랜잭션은 A 트랜잭션에 의해 수정된 데이터를 이용하여 트랜잭션을 진행함.

    2. READ COMMITTED (Oracle Default)

    • 1과 달리 Commit 된 데이터만 조회해온다.
    • UNDO 영역에 저장된 데이터를 참조하기 때문에 Dirty Read가 발생하지 않는다.
    • 하지만 NON-REPEATABLE READ 부정합 문제가 발생할 수 있다.
      • B 트랜잭션에서 ID 1번 상품의 가격을 조회 => 10,000원
      • A 트랜잭션에서 ID 1번 상품의 가격을 10,000 -> 20,000원으로 수정 후 Commit
      • B 트랜잭션에서 ID 1번 상품의 가격을 다시 조회 => 20,000원 (NON-REPEATABLE READ)

    3. REPETABLE READ (MySQL Default)

    • 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있음.
    • 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 Commit된 데이터만 조회함.
    • 자신의 트랜잭션 번호보다 높은 트랜잭션에 의해 변경된 데이터는 Commit에 상관 없이 UNDO 영역만 조회.
    • 2와 달리 NON-REPEATABLE READ 부정합 문제가 발생하지 않는다.
      • A 트랜잭션(no: 10)에서 ID 1번 상품의 가격을 조회 => 10,000원
      • B 트랜잭션(no: 12)에서 ID 1번 상품의 가격을 10,000 -> 20,000원으로 수정 후 Commit
      • A 트랜잭션에서 ID 1번 상품의 가격을 다시 조회 => 10,000원

    4. SERIALIZABLE

    • 트랜잭션에서 데이터 SELECT 시 공유잠금을 설정함으로써, 해당 데이터를 수정하지 못하도록 설정함.
    • 격리수준을 REPETABLE READ 로 적용하면 뭐든 해결인가? => 아니다. Phantom READ (유령읽기) 문제가 발생한다.
      • A 트랜잭션에서 SELECT * FROM PRODUCT WHERE PRODUCT_ID < 5 => 1개 상품 조회
      • B 트랜잭션에서 id 3인 상품 신규 생성 후 커밋
      • A 트랜잭션에서 동일한 SQL 실행 => 2개 상품 조회

     

Designed by Tistory.