데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위
commit
rollback
원자성(Atomicity)
rollback segment
: 트랜잭션 진행시 데이터가 변경될 때 이전 데이터를 저장하는 공간rollback
연산을 수행하여 트랜잭션을 수행하기 이전 상태로 되돌린다.save point
를 지정하면, 이후 rollback시 save point 이후에 수행한 작업만 초기화할 수 있다.일관성(Consistency)
trigger
: 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
(코드 출처: https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)
고립성(Isolation)
Serializable
으로 설정한다. (아래에서 설명할 것이다.)Serializable
로 통일하면 좋은 거 아닌가?참고) 동시성(concurrency) vs 병행성(parallelism)
- concurrency는 하나의 코어가 여러 일을 동시에 하는 것이다. 일의 주체인 코어가 하나이므로, A => B => C를 번갈아가며 한다.
- parallelism은 멀티 코어가 각자 자기 일을 하는 것이다. concurrency가 한 사람의 멀티 태스킹이라면, parallelism은 애초에 여러 사람이 동시에 일하는 것으로 이해할 수 있다.
트랜잭션 격리 수준
Read Uncommitted
Read Committed
Repeatable Read
Serializable
풀어서 정리하면 다음과 같다. Read Uncommitted
는 커밋되지 않은 데이터를 읽을 수 있다는 문제를 가진다. 이를 해결한 것이 Read Committed
다. 하지만 이 수준에서도 여전히 읽는 동안 데이터가 변경되어, 반복 가능한(repeatable) 읽기가 불가능한 문제가 있을 수 있다. 그래서 트랜잭션이 같은 데이터를 반복해서 읽더라도 같은 데이터를 읽도록 한 것이 Repeatable Read
다. 그런데 이 수준에서도 여전히 문제가 발생할 수 있다. 반복 가능한 읽기를 보장해야 하므로 트랜잭션에 해당하는 데이터를 변경할 수는 없지만, 새로운 데이터를 추가/삭제할 수는 있기 때문이다. 트랜잭션 A의 수행 중 트랜잭션 B에서 새로운 데이터를 추가/삭제하면, 트랜잭션 A는 트랜잭션 도중 바뀐 데이터를 읽게 된다. 이를 Phantom Read라고 하며, 이와 같은 문제를 해결하기 위한 것이 Serializable
이다. 이 단계에서는 새로운 데이터를 추가/삭제하는 것도 불가능하다.
지속성(Durability)
https://www.youtube.com/watch?v=poyjLx-LOEU
https://victorydntmd.tistory.com/129
https://fauna.com/blog/introduction-to-transaction-isolation-levels
https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
https://gyoogle.dev/blog/computer-science/data-base/Transaction.html