트랜잭션은 작업의 완전성을 보장해 준다.
잠금과 트랜잭션은 비슷한 개념 같지만, 잠금은 동시성을 제어하는 기능이며 트랜잭션은 데이터 정합성을 보장하는 기능이다.
트랜잭션은 DBMS의 커넥션과 마찬가지로 최소의 코드에만 적용하는 것이 좋다.
특히, 네트워크 작업 등 긴 시간이 걸리는 작업은 제외해야 한다.
여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지 결정함
각 트랜잭션의 변경 내용이 commit이나 rollback 여부에 상관 없이 다른 트랜잭션에서 보임
어떤 트랜잭션에서 데이터를 변경했더라도 commit이 완료된 데이터만 다른 트랜잭션에서 조회 가능
테이블 데이터 ⇒ (’한국’, ‘서울')
[A 세션] 트랜잭션 시작
[A 세션] 데이터 변경 (‘한국’, ‘서울’) → (’한국’, ‘경기’)
[B 세션] 트랜잭션 시작
[B 세션] 조회: (’한국’, ‘서울’)
[A 세션] 커밋
[B 세션] 조회: (’한국’, ‘경기’)
⇒ 한 트랜잭션 내에서 같은 쿼리문이 실행되었음에도 불구하고 조회 결과가 다른 문제(Phantom read)
InnoDB 스토리지 엔진은 트랜잭션이 Rollback 될 가능성에 대비해 변경되기 전 레코드를 언두 공간에 백업해두고 실제 레코드 값 변경