트랜잭션 격리 수준
데이터베이스 운영에서 동시에 읽은 데이터의 정확성을 효과적으로 보장하기 위해 트랜잭션 격리 수준이 제안됩니다.
추천: "mysql tutorial"
질문 제기
데이터베이스는 고객이 공유하고 접근하는 것이므로 데이터베이스 운영 중에 다음과 같은 불확실한 상황이 발생할 가능성이 높습니다.
업데이트 손실
두 트랜잭션 모두 동시에 데이터 행을 업데이트하며, 한 트랜잭션의 데이터 업데이트가 다른 트랜잭션의 데이터 업데이트를 덮어씁니다. 이는 시스템이 잠금 작업을 수행하지 않아 동시 트랜잭션이 격리되지 않기 때문입니다.
더티 읽기
트랜잭션은 다른 트랜잭션의 커밋되지 않은 데이터 작업 결과를 읽습니다. 이는 모든 작업이 롤백될 가능성이 있으므로 매우 위험합니다.
반복 불가능한 읽기
반복 불가능한 읽기: 트랜잭션은 동일한 데이터 행을 두 번 읽지만 다른 결과를 얻습니다.
다음 상황을 포함합니다.
(1) 가상 읽기: 트랜잭션 T1이 특정 데이터를 읽은 후 트랜잭션 T2가 이를 수정합니다. 트랜잭션 T1이 데이터를 다시 읽으면 이전 시간과 다른 값을 얻습니다.
(2) Phantom Reads: 트랜잭션이 작업 중에 두 개의 쿼리를 수행합니다. 두 번째 쿼리의 결과에는 첫 번째 쿼리에 나타나지 않은 데이터가 포함되거나 첫 번째 쿼리에 나타난 데이터가 부족합니다. 두 쿼리의 진술이 동일해야 함). 이는 두 쿼리 중에 데이터를 삽입하는 다른 트랜잭션으로 인해 발생합니다.
Solution
위의 상황을 방지하기 위해 표준 SQL 사양에서는 4개의 트랜잭션 격리 수준을 정의하고 있으며, 격리 수준에 따라 트랜잭션을 다르게 처리합니다.
무단 읽기
커밋되지 않은 읽기라고도 함: 더티 읽기는 허용되지만 손실된 업데이트는 허용되지 않습니다. 트랜잭션이 데이터 쓰기를 시작한 경우 다른 트랜잭션은 동시에 쓸 수 없지만 다른 트랜잭션은 이 데이터 행을 읽을 수 있습니다. 이 격리 수준은 "독점적 쓰기 잠금"을 통해 달성할 수 있습니다.
승인된 읽기
커밋된 읽기라고도 함: 반복 불가능한 읽기는 허용되지만 더티 읽기는 허용되지 않습니다. 이는 "일시적 공유 읽기 잠금" 및 "독점적 쓰기 잠금"을 통해 달성할 수 있습니다. 데이터를 읽는 트랜잭션을 통해 다른 트랜잭션은 계속해서 데이터 행에 액세스할 수 있지만 커밋되지 않은 쓰기 트랜잭션은 다른 트랜잭션이 해당 행에 액세스하지 못하게 합니다.
반복 읽기
반복 읽기: 반복 불가능 읽기 및 더티 읽기는 금지되지만 팬텀 읽기 데이터가 가끔 발생할 수 있습니다. 이는 "공유 읽기 잠금" 및 "독점 쓰기 잠금"을 통해 달성할 수 있습니다. 데이터를 읽는 트랜잭션은 쓰기 트랜잭션을 비활성화하고(읽기 트랜잭션은 허용) 쓰기 트랜잭션은 다른 트랜잭션을 비활성화합니다.
직렬화 가능
직렬화 가능: 엄격한 트랜잭션 격리를 제공합니다. 트랜잭션은 순차적으로 실행되어야 하며 트랜잭션은 하나씩만 실행할 수 있으며 동시에 실행할 수는 없습니다. 트랜잭션 직렬화는 "행 수준 잠금"을 통해서만 달성할 수 없습니다. 방금 쿼리 작업을 실행한 트랜잭션이 새로 삽입된 데이터에 액세스하지 못하도록 하기 위해 다른 메커니즘을 사용해야 합니다.
격리 수준이 높을수록 데이터의 완전성과 일관성이 보장되지만 동시성 성능에 미치는 영향은 더 커집니다. 대부분의 애플리케이션에서는 데이터베이스 시스템의 격리 수준을 커밋된 읽기로 설정하는 데 우선순위를 부여할 수 있습니다. 더티 읽기를 방지하고 동시성 성능이 향상됩니다. 반복 불가능 읽기, 팬텀 읽기 및 유형 II 업데이트 손실과 같은 동시성 문제가 발생하더라도 이러한 문제가 발생할 수 있는 개별 상황에서는 비관적 잠금 또는 낙관적 잠금을 사용하여 애플리케이션에서 이러한 문제를 제어할 수 있습니다.
프로그래밍과 관련된 더 많은 내용은 PHP 중국어 홈페이지 프로그래밍 입문 칼럼을 주목해주세요!
위 내용은 트랜잭션 격리 수준에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!