(둘이 비슷한 개념 같아 보이지만)
일관성(Consistency)
트랜잭션을 실행 완료 후에도 트랜잭션 실행 전과 같이 일관성 있는 데이터베이스 상태를 유지한다.
(여기서 말하는 데이터: 시스템이 가지고 있는 고정 요소)
고립성(Isolation)
각 트랜잭션은 다른 트랜잭션의 간섭없이 독립적으로 수행되어야 한다.
한 트랜잭션이 처리 중인 데이터를 다른 트랜잭션이 접근할 수 없다.
지속성(Durability)
트랜잭션이 정상적으로 완료된 다음에는 데이터베이스에 트랜잭션 작업 결과가 영구적으로 저장되어야 한다.
Active
트랜잭션이 수행 중인 상태
Partially Committed
트랜잭션의 마지막 연산까지 수행하였고, Commit 연산 수행 직전의 상태
Committed 트랜잭션을 성공적으로 완료한 상태, Commit 연산을 실행한 이후의 상태
Failed
트랜잭션이 실행 중에 오류가 발생하여, 실행 중단된 상태
Aborted
트랜잭션이 취소된 상태, rollback을 수행하여 트랜잭션 실행 이전 데이터로 돌아간 상태
두개의 트랜잭션이 서로가 처리 중인 데이터를 대기하여, 영원히 대기하게 되고 작업이 진행되지 않는 상태
교착상태 예시
트랜잭션을 자주 커밋한다.
커밋을 자주하면, 다른 트랜잭션에서 데이터를 대기하는 시간이 줄어든다.
정해진 순서로 테이블에 접근한다.
앞선 예시에서 트랜잭션 1은 테이블 A -> 테이블 B 순으로 접근했고,
트랜잭션 2는 테이블 B -> 테이블 A순으로 접근했다.
트랜잭션들이 테이블을 동일한 순서로 접근하도록 한다.
읽기 잠금 획득 (SELECT ~ FOR UPDATE)의 사용을 피한다.
읽기 작업은 잠금을 하지 않더라도, 동시 접근했을 때 크게 문제가 발생하지 앟는다. (정확한 데이터를 얻어야 하는 것이 아니라면)
여러 커넥션에서 한 테이블의 여러 행을 순서없이 갱신하면 교착상태가 발생하기 쉽다.
이런 경우 테이블 단위 잠금을 하여, 갱신 작업을 직렬화하면 동시성을 떨어지지만 교착상태를 피할 수 있다.