데이터베이스에서 하나의 논리적 작업 단위
모든 작업이 성공해야만 최종적으로 반영되고, 하나라도 실패하면 전체 작업이 취소(Rollback)됨
데이터의 일관성을 유지하기 위해 사용됨
Atomicity (원자성)
: 트랜잭션 내의 모든 작업은 모두 성공 또는 모두 실패해야 함
Consistency (일관성)
: 트랜잭션이 실행되기 전과 후의 데이터가 일관성을 유지해야 함
Isolation (고립성)
: 여러 트랜잭션이 동시에 실행될 때, 서로 영향을 주지 않아야 함
Durability (지속성)
: 트랜잭션이 완료되면 그 결과가 영구적으로 반영되어야 함
트랜잭션은 실행되는 동안 여러 상태를 거치며 진행
Active (활성 상태)
: 트랜잭션이 시작되어 실행 중인 상태
Partilly Committed (부분 완료 상태)
: 트랜잭션이 모든 SQL문을 실행했지만 아직 확정(COMMIT)되지 않은 상태
Committed (완료 상태)
: 트랜잭션이 성공적으로 완료되어 데이터가 영구적으로 반영된 상태
Failed (실패 상태)
: 오류로 인해 트랜잭션이 정상적으로 완료되지 못한 상태
Aborted (중단 상태)
: 트랜잭션이 실패하여 ROLLBACK이 수행된 상태
장애 발생 시 데이터 일관성을 보장하기 위한 복구 필요
트랜잭션의 원자성 보장을 위한 메커니즘
트랜잭션의 작업 내용을 로그에만 기록하고, 실제 DB 반영은 COMMIT 이후에 수행함
장애 발생 시, COMMIT된 트랜잭션만 반영하면 됨 -> Redo 연산 사용
COMMIT되지 않은 트랜잭션은 무시하면 됨
즉시 갱신 방식
트랜잭션이 시작되고 쿼리를 하나하나 실행할 때마다 DB에 바로 반영하며, 변경 전 데이터는 Undo 로그에 함께 저장
장애 발생 시 트랜잭션 일부 작업이 반영되어 있을 수 있음
COMMIT되지 않은 트랜잭션 내의 작업을 되돌리기 위해 Undo 연산 사용
Undo 연산: 트랜잭션 도중 장애 발생 시, 이미 반영된 데이터를 원래 값으로 복구하는 작업
COMMIT된 트랜잭션이 장애로 인해 DB에 반영되지 못했을 경우, 트랜잭션 로그에 따라 다시 반영하는 작업
트랜잭션 로그에 기록된 값(New Value)을 DB에 반영함
하나의 트랜잭션에서 작업 중인 데이터가 다른 트랜잭션에 영향을 받지 않는 정도를 의미
반대로 하나의 트랜잭션에서 작업 중인 데이터를 다른 트랜잭션에서 어느 정도까지 접근 할 수 있는가를 나타냄
트랜잭션 격리 수준의 설정
격리 수준을 낮게 설정 >> 동시성이 좋아짐
격리 수준을 높게 설정 >> 동시성은 떨어지나 정확성이 좋아짐
따라서 둘 사이의 trade-off를 고려해야 함
: 다른 트랜잭션이 CCOMMIT되지 않은 데이터도 읽을 수 있음
가장 낮은 격리 수준,
Dirty Read 발생 가능
(다른 트랜잭션이 COMMIT하지 않은 데이터를 읽을 수 있음)
: COMMIT된 데이터만 읽을 수 있음
Dirty Read를 방지하지만 Non-Repeatable Read 발생 가능
(같은 데이터를 다시 조회했을 때 값이 바뀌어 있음)
: 같은 트랜잭션 내에서 동일한 데이터를 읽으면 항상 같은 값이 반환됨 (트랜잭션이 시작되기 전에 커밋된 내용에 대해서먄 조회)
Non-Repeatable Read를 방지하지만 Phantom Read 발생 가능
(같은 조건으로 조회했을 때 새로운 데이터가 나타남)
(REPEATABLE READ는 기존 행의 수정/삭제는 막지만, 삽입은 막지 못하기 때문)
: 트랜잭션을 직렬화하여 동작 (가장 엄격)
각 트랜잭션이 마치 하나씩 순서대로 실행된 것처럼 보이게 동작
일반적인 웹 애플리케이션: READ COMMITTED / REPEATABLE READ
데이터 일관성이 중요한 경우 (EX. 은행 시스템): SERIALIZABLE을 사용하나 성능 저하를 고려해야 함
대량 트랜잭션이 필요한 경우 (EX. 쇼핑몰): READ COMMITTED으로 성능 우선
MySQL 기본값: REPEATABLE READ
PostgreSQL 기본값: READ COMMITTED
Oracle 기본값: READ COMMITTED