티스토리 뷰

트랜잭션

  • 테이블의 내용을 변경하는 SQL들이 연달아 실행되며 이것들이 마치 하나의 SQL처럼 모두 성공하거나, 하나라도 실패하면 모두 실패하는 등의 동작이 필요하면 트랜잭션을 사용해야 한다.
  • 원자성을 만족하는 것을 말한다.
  • DDL이나 DML중 INSERT/UPDATE/DELETE에 의미가 있다.
  • SELECT는 조회만 하기 때문에 트랜잭션을 사용할 이유가 없다.
  • BEGIN과 END, BEGIN과 COMMIT 사이에 해당 SQL들을 사용한다.
  • ROLLBACK을 통해 트랜잭션 실행중 에러가 발생하면 트랜잭션 시작 전 상태로 되돌린다.

 

예시

  • 계좌 이체 : A가 B에게 송금한다.
  • 계좌 이체는 출금만 성공하고 입금이 실패하면 안 된다.
  • 두 개의 트랜잭션이 하나처럼 동작을 해야 한다. -> Atomic하다.
  • 조회만 하는 경우이면 트랜잭션으로 묶을 이유가 없다.
    • 데이터가 변하지 않기 때문에 조회 중간에 실패하더라도 데이터의 정합성에는 문제가 없다.
  • BEGIN; -- START TRANSACTION
        A의 계좌에서 인출;
        B의 계좌로 입금;
    END; -- COMMIT
  • BEGIN과 START TRANSACTION은 같은 의미이다.
    END와 COMMIT은 같은 의미이다.
  • BEGIN 전의 상태로 돌아가고 싶으면 ROLLBACK을 실행한다.
  • 트랜잭션 동작은 autocommit 모드에 따라 달라진다.

 

트랜잭션 커밋 모드

autocommit = True

  • 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여진다. 이를 커밋된다고 한다.
  • autocommit이 True인 경우에만 트랜잭션을 사용할 수 있다.
  • 만약 특정 작업을 트랜잭션으로 묶고 싶으면 BEGIN(START TRANSACTION) END(COMMIT)/ROLLBACK 으로 처리한다.
  • 트랜잭션이 진행중이라도 다른 사람들은 트랜잭션 시작 전 상태를 보게 된다.
  • BEGIN;
    DELETE FROM 테이블;
    INSERT INTO 테이블 VALUES (값1, 값2);
    ROLLBACCK;

autocommit = False

  • 모든 레코드 수정/삭제/추가 작업이 COMMIT이 호출될 때까지 커밋되지 않는다.
  • 모든 것이 명시적으로 커밋/롤백을 해야 반영되기 때문에 트랜잭션의 개념이 없다
  • 즉 명시적으로 커밋을 해야한다.
  • ROLLBACK이 호출되면 앞에 했던 작업들이 무시된다.
728x90
반응형
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함