트랜잭션은 데이터베이스의 상태를 변화시키는 작업 단위를 말한다. 데이터베이스를 사용하는 가장 큰 이유 중 하나일 것이다.
만약 A계좌에서 B계좌로 계좌이체를 하려고할 때, A계좌에서 돈이 빠져나갔지만 B계좌로 가는 중 예외 혹은 에러가 발생했다. 따라서 B계좌에는 돈이 들어오지 않았다. A계좌는 분명 돈이 나갔는데 B는 들어오지 않았다면 무엇이 문제인가..?
트랜잭션은 commit 혹은 rollback이 수행되기 전까지는 데이터베이스에 실질적인 영향을 주지 않는다. 해당 트랜잭션을 수행하고있는 세션만이 결과를 확인할 수 있으며 다른 세션은 변경사항을 확인할 수 없다.
commit하면 변동사항이 작업완료처리되어 데이터베이스에 반영되며, rollback하는 경우 transaction이 시작하기 전으로 데이터베이스가 복구된다.
commit은 기본적으로 '자동 커밋' 상태이다. 즉, 특별한 설정을 해주지 않는다면 각각의 쿼리를 수행한 뒤 자동으로 커밋해준다. 자동 커밋 상태라면 커밋 혹은 롤백의 기회없이 커밋되기 때문에 트랜잭션의 역할을 정상적으로 수행할 수 없을 것이다.
그래서 수동 커밋으로 설정하는 순간을 트랜잭션이 시작하는 것이라고 할 수 있겠다.
set autocommit true; # 자동 커밋 true (default)
set autocommit false; # 수동 커밋 true -> 트랜잭션 시작
트랜잭션에는 락을 걸어 다른 세션에서 접근하지 못하게 할 수 있다.
따로 락을 걸지 않더라도, update나 delete 등의 작업을 수행하면 자동으로 lock이 걸린다. 만약 A 세션이 해당 데이터를 조작하고 있다면, B 세션은 해당 데이터를 조작할 수 없고, 대기상태에 빠진다. LOCK_TIMEOUT이 종료되면 timout으로 예외가 발생하고 B 세션에서 시도한 쿼리는 삭제된다. 만약 TIMEOUT 전에 A 세션이 트랜잭션을 commit하거나 rollback해서 트랜잭션 작업을 마무리했다면, 자동으로 세션 B의 작업이 시작된다.
트랜잭션은 다음과 같은 4가지 특성을 보장해야한다.