개발자허허의 오늘은 뭐 먹지?

DB Transaction의 ACID와 Isolation Level 본문

Dev/자세히 알아보기

DB Transaction의 ACID와 Isolation Level

duck67 2021. 4. 24. 22:06
반응형

Transaction이란 DBMS에서 데이터를 다루는 논리적인 작업의 단위이다.

 

Transcation ACID

1. Atomicity (원자성) : 한 Transaction의 작업은 전부 수행되거나 전부 수행되면 안 됨

2. Consistency (일관성) : Transaction의 수행 전/후에서 DB는 항상 일관된 상태여야 함 (업데이트한 데이터의 합이 전과 후에 달라지지 않아야 함 등)

3. Isolation (고립성) : 수행 중인 Transactino에 다른 Transaction이 끼어들어 변경하려는 데이터 값이 의도치 않게 변경되면 안 됨

4. Durability (지속성) : Transaction 수행 후 변경한 데이터는 영구적으로 저장되어야 함

 

Isolation Level

ACID를 다 지키면 동시성이 매우 떨어지기 때문에 이를 희생해서 동시성을 얻는 방법이다. (아래로 갈수록 더 높은 레벨임)

1. READ UNCOMMITTED

    - 아직 COMMIT되지 않은 값을 읽어올 수 있음.

2. READ COMMITTED

    - PostgreSQL의 기본값

    - COMMIT된 데이터만 보이는 수준을 보장함. READ시마다 SNAPSHOT을 뜸, Gap lock을 사용하지 않음.

     - ex. SELECT * FROM TABLE WHERE ID BETWEEN 3 AND 10 FOR UPDATE; 로 했을 때

             3에서 10을 모두 lock잡지 않고, 값이 존재하는 row에만 record lock을 걸음.

             따라서 transcation이 여러개 실행되었을 때도 존재하지 않는 값은 insert가 가능하며

             insert가 commit되면 select에 반영됨

3. REPEATABLE READ

     - MySQL의 기본값

     - 반복해서 READ를 수행하더라도 READ한 값이 바뀌지 않음을 보장함.

     - READ할 때의 시점을 저장하고 있다가, 다음 번 READ요청시 가장 처음의 SNAPSHOT을 보여주게 함. Gap lock사용.

4. SERIALIZABLE

     - 아래와 같은 순서에서, timeout이 발생하게 됨

       A SELECT (transaction1) -> B SELECT(transaction2) -> A Update(transaction1) -> B Update(transaction2)

     - Dead lock이 자주 발생함

 

Isolation을 지키기 위해서 할 일

1. SELECT FOR UPDATE 사용

    - SELECT FOR UPDATE하면 LOCK이 걸림.

      다른 Transaction이 읽기를 시도할 때 기존 Transaction이 Commit 또는 Rollback이 될 때까지 기다림

2. UPDATE를 Transaction 맨 마지막에 한번에 처리 (어플리케이션에서 겹치지 않게 잘..)

3. Optimistic LOCK

   - 테이블에 버전 필드를 추가해서 SELECT할 때 가지고 오고

   - UPDATE할 때 WHERE절에 버전을 명시하고, 버전은 기존 버전 + 1로 업데이트를 시도함

   - 만약에 UPDATE된 레코드 수가 0개라면 다른 Transaction에서 변경한 것임

   - Transaction의 Rollback은 어플리케이션에서 알아서..

반응형
Comments