Transaction?
A에서 B로 5000원 계좌이체를 한다고할때 다음 2가지 작업이 필요할 것이다.
- A의 잔고 5000원 감소
- B의 잔고 5000원 증가
만약 1번 작업은 성공했고 2번에서 문제가 발생하여 실패한다면 A만 5000원이 감소하게될 것이다. 이를 해결하기위해 트랜잭션은 1, 2 모두 성공해야 작업을 완료하고 둘 중에 하나라도 실패하면 거래 전의 상태로 되돌려준다.
이때 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 commit
, 하나라도 실패해서 작업 이전으로 되돌리는 것을 rollback
이라 한다.
Commit
START TRANSACTION;
UPDATE account SET balance = balance - 5000 WHERE id = 'A';
UPDATE account SET balance = balance + 5000 WHERE id = 'B';
COMMIT;
- transaction 시작 이후 작업한 내용을 DB에 영구적으로 저장한다.
ROLLBACK
START TRANSACTION;
UPDATE account SET balance = balance - 5000 WHERE id = 'A';
ROLLBACK;
- 작업을 모두 취소하고 transaction 이전 상태로 되돌린다.
AUTOCOMMIT
# AUTOCOMMIT 활성화 여부 확인
SELECT @@AUTOCOMMIT;
- 각각의 SQL문을 자동으로 transaction 처리해준다.
- SQL 문이 성공적으로 실행되면 자동으로 commit 한다.
- 실행 중에 문제가 발생한다면 알아서 rollback을 수행한다.
NOTE
MySQL에서는 기본적으로 autocommit이 활성화되어 있다. 또한 START TRANSACTION을 실행하게 될 경우 autocommit은 비활성화된다. 반대로 commit/rollback을 수행하면 transaction이 종료되면 autocommit이 다시 원래 상태로 되돌아간다.
ACID
- 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패애햐 한다.
- 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야한다.
- 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야한다.
- 지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 문제가 발생해도 로그 등을 사용해서 성공한 내용을 복구해야한다.