데이터베이스에서의 트랜잭션 이란?
➡️ 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 이 때, 하나의 논리적 기능을 수행하기 위해서는 여러 개의 질의(쿼리)가 필요할 수 있음
- 트랜잭션은 묶여있는 여러 질의들을 모두 완료해야 정상적으로 종료됨
- 만약 트랜잭션에 속해있는 질의 중 하나라도 실패하면 그 트랜잭션은 실패한 것임
EX) 인터넷 뱅킹으로 10000 원을 송금하는 상황
- A 가 B 에게 10000 원을 송금하는 경우 A 의 계좌에서 10000 원을 차감하고, B 의 계좌에서 10000 원을 증가시킴
START TRANSACTION;
UPDATE Account SET balance = balance - 10000 WHERE account_id = 'A';
UPDATE Account SET balance = balance + 10000 WHERE account_id = 'B';
COMMIT;
- 위의 송금 과정이 하나의 트랜잭션이 됨
- DBMS 의 성능은 초당 트랜잭션의 실행수(TPS : Trasaction Per Second)로 측정됨
COMMIT, ROLLBACK
- COMMIT
- 트랜잭션이 성공적으로 완료되었음을 의미하는 명령어. 트랜잭션에서 수행된 모든 변경사항이 데이터베이스에 영구적으로 반영되었으므로 commit 이후에는 트랜잭션을 절대 취소할 수 없음
- ROLLBACK
- WayPoint로 ROLLBACK 지점을 설정할 수 있음
- 트랜잭션에서 수행된 모든 변경사항을 취소하고 데이터베이스를 트랜잭션이 시작되기 이전의 상태로 되돌리는 명령어
트랜잭션을 사용하는 이유는?
트랜잭션의 ACID 란?
- 데이터베이스의 트랜잭션은 ACID 라는 특성을 가지고 있음
- ACID 는 트랜잭션의 안정성을 보장하기 위해 필요한 성질임
Atomicity(원자성)
- 한 트랜잭션의 연산들이 반드시 모두 성공하거나, 모두 실패되는 성질(All or Nothing)
- 트랜잭션의 연산들은 부분적으로 성공할 수 없음
- 트랜잭션을 실행했는데 특정 부분에서 오류가 발생한다면, 그 트랜잭션은 통째로 실패한 것으로 처리됨
Consistency(일관성)
- 데이터베이스의 상태는 트랜잭션 실행 이전, 이후에 일관적이야하는 성질
- 여기서 말하는 일관성이란?
- 모든 고객은 반드시 이름을 가지고 있어야한다.
- 송금 전후 모든 금액의 데이터 타입은 정수형이어야한다.
Isolation(고립성)
- 모든 트랜잭션은 다른 트랜잭션으로부터 고립(다른 트랜잭션의 실행 여부를 알지 못하는 상태)되도록 하는 성질
- 동시에 여러 트랜잭션들을 실행한 결과는 각 트랜잭션을 순서대로 실행한 결과와 같음
- A 의 계좌에는 10000 원이 있음
- 트랜잭션 1
- A 의 계좌에서 6000 원 출금
- 트랜잭션 2
- A 의 계좌에서 6000 원 출금
- 고립성이 없을 경우 트랜잭션 1, 2 가 동시에 실행되면 A 의 계좌는 -2000 원이 됨
- 그러나 고립성으로 인해 하나의 트랜잭션은 출금을 정상적으로 진행하고, 나머지 하나의 트랜잭션은 잔액 부족으로 출금을 하지 못함
- 그렇다고 해서 실제로 트랜잭션을 순서대로 실행하는 것은 아니다. 너무 느리기 때문에.. 따라서 트랜잭션은 마치 프로세스처럼 병행적(Concurrent 하게)으로 실행하되 lock 을 사용해서 마치 순서대로 실행되는 것과 같은 결과를 내도록함
고립성을 어떻게 보장할까?
- lock 을 사용해서 고립성을 보장함
- shared_lock(read_)
- 다른 트랜잭션들에게 데이터 쓰기를 허용하지 않고 오직 읽기만 허용하는 lock
- exclusive_lock(write_)
- 다른 트랜잭션들이 데이트를 쓸수도, 읽을 수도 없도로 하는 lock
- 데드락이 존재
Durability(지속성)
- 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성질
- 런타임 에러나 시스템 에러가 발생해도, 해당 기록은 영구적으로 남음
- 즉, 성공적으로 수행된 트랜잭션은 데이터베이스에 영원히 반영이 되어야함
- Redis → 영속성