Blog
스터디
Someone pooped on my CS
쉬운코드 트랜잭션

Auto Commit

  • 각각의 SQL문을 자동으로 transaction으로 처리해주는 개념

  • SQL문이 성공적으로 실행하면 자동으로 commit 함

  • 실행 중에 문제가 있었다면 알아서 롤백

  • 기본적으로 enable되있음

  • Auto Commit 설정 확인

SELECT @@AUTOCOMMIT;
  • Auto Commit 설정 해제
SET AUTOCOMMIT = 0;

Auto Commit 설정 해제 후 SQL문을 실행하면 Rollback 가능

Auto Commit 설정 해제 후 rollback시 rollback 가능

Auto Commit 설정 후 rollback해도 아무것도 rollback 되지 않음

ACID

Atomicity

  • All or Nothing
  • 모두 성공하거나 모두 실패해야 함

Consistency

  • transaction은 DB 상태를 consistent 상태에서 또 다른 conssitent 상태로 변경해야 함
  • constraint, trigger, cascade 등을 통해 DB에 정의된 rules를 transaction이 위반했다면 rollback
create table test
(
    name text
);
 
insert into test(name)
values (null);
 
ALTER table test
    modify column name text NOT NULL;

null 데이터가 있는데 NOT NULL로 변경하려고 하면 에러 발생

Isolation

  • 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만듬

Durability

  • commit된 transaction은 DB에 영구적으로 저장함

Isolation Level 이외의 이상현상

Dity write

  • commit이 안된 데이터를 write 함으로써 rollback을 할 때 정상적으로 recovery가 되지 않는 현상
  • 예시
    • 1번 트랜잭션이 값을 0에서 10으로 변경
    • 2번 트랜잭션이 값을 10에서 100으로 변경
    • 1번 트랜잭션이 rollback해서 값을 0으로 돌림
    • 2번 트랜잭션이 rollback해서 값을 10으로 돌림
    • 이 경우 1번 트랜잭션의 실행결과로 0을 기대했으나 10이 그대로 쓰여져 있음

Lost update

  • 업데이트를 했는데 덮어씌워지면서 업데이트가 사라지는 현상
  • 위 사진에서 Transaction 2번의 실행결과는 사라짐

dirty read의 확장적인 개념

  • 위 시나리오는 송금하는 경우의 시나리오임
  • x 계좌에서 y 계좌로 40을 송금하는 경우
    • 1번 트랜잭션에서 x 계좌에서 40을 뺌
    • 2번 트랜잭션에서 x, y 값을 읽음 (각각 x=10, y=50) <- dirty read
      • 여기서 x + y의 총 합이 100이 안되어서 데이터 정합성이 깨짐
    • 1번 트랜잭션에서 y 계좌에 40을 더함

read skew

  • 위 시나리오 역시 송금하는 경우의 시나리오임
  • 설명
    • 2번 트랜잭션에서 x 값을 50으로 읽음
    • 1번 트랜잭션에서 계좌 송금 완료 (x = 10, y = 90)
    • 2번 트랜잭션에서 y 값을 90으로 읽음
      • 2번 트랜잭션 결과로 x + y의 총 합이 140이 안되어서 데이터 정합성이 깨짐

write skew

  • X Y 두 계좌가 있고 하나의 계좌가 마이너스 통장이 될 수 있음
  • 1번 계좌와 2번 계좌에서 동시에 각각 80, 90을 인출하는 경우
  • 1번 계좌가 -30, 2번 계좌가 -40이 되면서 x + y >= 0이라는 제약 조건을 만족하지 못하는 경우 발생

panthom read

Reference