본문 바로가기

CS

트랜잭션

728x90

ACID

Atomic (원자성)

  • All or Nothing, 모든 작업이 실행되거나 혹은 모두 실행되지 않아야 합니다.
  • 예시) A계좌에서 B계좌로 잔액을 송금할 때
    'A계좌 잔액 줄이기' 작업과 'B계좌 잔액 늘리기' 작업은 함께 성공하거나 함께 실패해야 합니다.

Consistency (일관성)

  • 모든 트랜잭션이 종료된 후에는 DB의 제약 조건을 모두 지키고 있는 상태가 되어야 합니다.
  • 예시) 잔액은 0원 이상이다.
    이를 위반하는 트랜잭션은 모두 중단됩니다.

Isolation (격리성)

  • 트랜잭션은 다른 트랜잭션과 독립적으로 동작해야 합니다.
  • A 트랜잭션이 하는 일을 B 트랜잭션은 모르게 해야합니다.
  • 하지만 현실은...
    성능과 안정성의 트레이드 오프 관계에 있는 부분입니다.
  • READ_UNCOMMITTED > READ_COMMITTED > REPEATABLE_READ > SERIALIZABLE 순서로
    성능은 떨어지고 격리성(고립성)은 증가합니다.
  • 격리성이 낮을 때 일어나는 문제 : Dirty read(처음 트랜잭션을 시작할 때 값과 끝날 때의 값이 달라지는), Phantom read(트랜잭션 처음에는 값이 있었지만 트랜잭션 후에는 값이 사라지는) 등이 발생 가능합니다.
  • 일반적으로 MySQL InnoDB의 기본 값인 REPEATABLE_READ를 많이 활용합니다.

Durability (지속성)

  • commit을 하게 되면 지속(저장)이 꼭 됩니다.
  • DB 저장이 실패하더라도 모든 로그를 남겨서 DB에 순차적으로 모두 반영이 되도록 합니다.