- 더티 읽기 : 다른 트랜잭션에서 UNCOMMITED 데이터 읽기
- 반복 불가능한 읽기 :
UPDATE
다른 트랜잭션의쿼리에서COMMITTED 데이터 읽기
- 팬텀 읽기 :다른 트랜잭션에서
INSERT
또는DELETE
쿼리에서COMMITTED 데이터를 읽습니다 .
참고 : 다른 트랜잭션의 DELETE 문은 특정 경우 반복 불가능한 읽기를 일으킬 가능성이 매우 낮습니다. 불행히도 DELETE 문은 현재 트랜잭션이 쿼리하는 것과 동일한 행을 제거합니다. 그러나 이것은 드문 경우이며 각 테이블에 수백만 개의 행이있는 데이터베이스에서는 발생하지 않을 가능성이 훨씬 높습니다. 트랜잭션 데이터를 포함하는 테이블은 일반적으로 모든 프로덕션 환경에서 높은 데이터 볼륨을 갖습니다.
또한 실제 INSERT 또는 DELETES가 아닌 대부분의 사용 사례에서 UPDATES가 더 빈번한 작업 일 수 있습니다 (이 경우 반복 불가능한 읽기의 위험 만 남아 있습니다.이 경우 팬텀 읽기 는 불가능합니다). 이것이 바로 UPDATES가 INSERT-DELETE와 다르게 취급되고 그 결과로 나타나는 변칙의 이름도 다른 이유입니다.
UPDATES 만 처리하는 대신 INSERT-DELETE 처리와 관련된 추가 처리 비용도 있습니다.
- READ_UNCOMMITTED는 아무것도 막지 않습니다. 제로 격리 수준입니다
- READ_COMMITTED는 단 하나만 예방합니다. 즉 Dirty 읽기
- REPEATABLE_READ는 더티 읽기와 반복 불가능 읽기의 두 가지 예외를 방지합니다.
- 직렬화 가능은 더티 판독, 반복 불가능 판독 및 팬텀 판독의 세 가지 이상을 모두 방지합니다.
그렇다면 왜 트랜잭션 SERIALIZABLE을 항상 설정하지 않습니까? 위의 질문에 대한 대답은 SERIALIZABLE 설정으로 인해 트랜잭션이 매우 느려져 다시 원하지 않습니다.
실제로 트랜잭션 시간 소비는 다음 비율입니다.
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
따라서 READ_UNCOMMITTED 설정이 가장 빠릅니다 .
요약
실제로 사용 시간을 분석하고 격리 수준을 결정 하여 트랜잭션 시간을 최적화하고 대부분의 이상을 방지해야합니다.
기본적으로 데이터베이스에는 REPEATABLE_READ 설정이 있습니다.