본문 바로가기

Database

Transaction 트랜잭션이란

트랜잭션

  • 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
  • 하나의 거래를 안전하게 처리하도록 보장
    • 하나의 거래가 처리되는 과정에서 하나라도 실패가 일어날 시 거래 이전의 상태로 되돌아가도록 한다
    • Commit : 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것
    • Rollback : 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것

트랜잭션 ACID

    1. 원자성 (Atomicity)

  • 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업처럼 모두 성공하거나 모두 실패해야 한다
  • 2. 일관성 (Consistency)

  • 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다
  • 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다
  • 3. 격리성 (Isolation)

  • 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 한다
  • 동시성과 관련된 성능 이슈로 인해 Isolation level을 선택할 수 있다
  • 4. 지속성 (Durability)

  • 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다

트랜잭션 격리 수준(Isolation level)

  • 격리성 완벽 보장을 위해선 트랜잭션을 순차적으로 실행해야 하는데, 이는 동시 처리 성능을 매우 악화시킨다. 따라서 ANSI 표준은 트랜잭션 격리 수준을 4단계로 정의하였다
    • READ UNCOMMITED (커밋되지 않은 읽기)
    • READ COMMITED (커밋된 읽기)
    • REPEATABLE READ (반복 가능한 읽기)
    • SERIALIZABLE (직렬화 가능)

COMMIT

  • 자동 커밋 : default. 각각의 쿼리 실행 직후 자동으로 커밋 호출
  • 수동 커밋 : COMMIT, ROLLBACK을 직접 호출하며 트랜잭션 수행
    • 보통 자동커밋 모드에서 수동커밋 모드로 전환하는 것을 트랜잭션을 시작한다고 표현
      set autocommit false; 

DB LOCK

  • 한 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아 트랜잭션의 원자성을 지킴
    • sessionAsessionB가 동시에 dataA에 대한 update를 수행하려고 하면, 조금 더 먼저 요청한 sessionA가 해당 로우에 대한 락을 획득한다
    • sessionA가 해당 로우에 대한 update sql을 수행하는 동안 sessionB는 락이 돌아올 때까지 대기한다
      • 이 때, 데이터베이스에 설정된 락 대기 시간만큼 대기하고 지나면 락 타임아웃 오류가 발생한다
        SET LOCK_TIMEOUT 60000;
    • sessionA의 SQL이 수행되고 트랜잭션이 종료되면 sessionB가 락을 획득한다
    • sessionB의 SQL이 수행되고 커밋 후 트랜잭션이 종료되면 락을 반납한다

SELECT FOR UPDATE

  • 일반적인 조회는 락을 사용하지 않지만 트랜잭션 종료 시점까지 해당 데이터를 다른 세션에서 변경하지 못하도록 강제로 막아야 할 때 사용
    • ex) 일일 마감 결산 시
      select * from member where member_id='memberA' for update;