이 기사는 MySQL의 4가지 격리 수준을 소개합니다. 이는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.
트랜잭션 격리는 생각보다 복잡합니다. SQL 표준에는 4가지 수준의 격리 수준이 정의되어 있습니다. 일반적으로 낮은 수준의 격리는 더 높은 동시성을 수행하고 시스템 오버헤드를 낮출 수 있습니다(권장 과정: MySQL 비디오 자습서)
READ UNCOMMITTED
이 수준은 Uncommitted Read입니다. 이 수준에서는 트랜잭션의 수정 사항이 커밋되지 않은 경우에도 다른 트랜잭션에서 볼 수 있습니다. 트랜잭션은 커밋되지 않은 데이터를 읽을 수 있으며, 이를 Dirty Read라고도 합니다. 이 수준은 많은 문제를 일으키며 성능 측면에서는 다른 수준보다 그다지 좋지는 않지만 다른 수준의 이점이 많이 부족합니다. 아주 꼭 필요한 이유가 있지 않는 이상 실제 응용에서는 거의 사용되지 않습니다.
READ COMMITTED
이 레벨은 읽기로 제출입니다. 이는 대부분의 데이터베이스 시스템의 기본 격리 수준이지만 MySQL은 아닙니다. 이 수준은 격리의 간단한 정의를 충족합니다. 즉, 트랜잭션이 시작되면 커밋된 트랜잭션에 의해 수정된 사항만 "볼" 수 있습니다. 즉, 트랜잭션이 처음부터 커밋될 때까지 수정 사항이 다른 트랜잭션에 표시되지 않습니다. 동일한 쿼리를 두 번 실행하면 다른 결과가 발생할 수 있으므로 이 수준을 반복 불가능한 읽기라고도 합니다.
REPEATABLE READ
이 수준은 MySQL의 기본 트랜잭션 격리 수준인 반복 읽기입니다. 이는 더티 읽기 문제를 해결하고 동일한 트랜잭션에서 동일한 레코드를 여러 번 읽은 결과가 일관되도록 보장합니다.
그러나 이론적으로 이 수준은 또 다른 문제인 환상 독서를 해결할 수 없습니다. 소위 팬텀 읽기는 트랜잭션이 특정 범위의 레코드를 읽을 때 다른 트랜잭션이 해당 범위에 새 레코드를 삽입하는 것을 의미합니다. 이전 트랜잭션이 해당 범위의 레코드를 다시 읽으면 팬텀 움직임이 생성됩니다.
팬텀 읽기 예: 첫 번째 트랜잭션은 테이블의 데이터를 수정합니다. 예를 들어 이 수정에는 테이블의 "모든 데이터 행"이 포함됩니다. 동시에 두 번째 트랜잭션도 이 테이블의 데이터를 수정합니다. 이 수정으로 인해 테이블에 "새 데이터 행"이 삽입됩니다. 그러면 나중에 첫 번째 트랜잭션을 수행하는 사용자는 마치 환각에 빠진 것처럼 테이블에 여전히 수정되지 않은 데이터 행이 있다는 것을 알게 될 것입니다. InnoDB 스토리지 엔진은 다중 버전 동시성 제어를 통해 환상 읽기 문제를 해결합니다.
SERIALIZABLE이 수준은 직렬화 가능하며 가장 높은 격리 수준입니다. 트랜잭션을 순차적으로 실행함으로써 앞서 언급한 팬텀 읽기 문제를 방지합니다. 즉, 이 수준은 읽은 데이터의 모든 행을 잠그므로 많은 시간 초과 및 잠금 경합 문제가 발생할 수 있습니다.
이 격리 수준은 실제 애플리케이션에서는 거의 사용되지 않으며 데이터 일관성을 보장하는 데 매우 필요하고 동시성이 허용되지 않는 경우에만 고려해야 합니다.
더티 읽기 가능 | 비반복 읽기 가능 | 팬텀 읽기 가능 | 잠긴 읽기 | |
---|---|---|---|---|
예 | 예 | 예 | 아니오 | |
No | Yes | Yes | No | |
No | No | Yes | No | |
아니요 | 아니요 | 아니오 | 응 |
위 내용은 MySQL의 4가지 격리 수준 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!