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이라는 제약 조건을 만족하지 못하는 경우 발생