집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 트랜잭션의 격리 수준은 무엇입니까?
왜 격리 수준을 고려해야 할까요?
트랜잭션은 동시에 실행되어야 하며 동시 실행으로 인해 더티 읽기, 반복 불가능한 읽기 및 가상 읽기와 같은 문제가 발생할 수 있으므로 일부는 발생이 허용되고 일부는 발생이 허용되지 않습니다. 다양한 수준 또는 동시성 제어는 다른 격리 수준을 갖지 않는 것으로 보입니다.
MySQL에서 지원하는 네 가지 격리 수준은 다음과 같습니다.
TRANSACTION_READ_UNCOMMITTED: 커밋되지 않은 읽기. 이는 트랜잭션 A가 커밋되기 전에 트랜잭션 B의 변경 사항을 볼 수 있음을 의미합니다. 이러한 방식으로 더티 데이터를 읽고 반복 불가능한 읽기와 팬텀 읽기가 허용됩니다.
TRANSACTION_READ_COMMITTED: 읽기 커밋(oracle 기본값), 커밋되지 않은 데이터 읽기가 허용되지 않음을 나타냅니다(더티 읽기 방지). 반복 불가능 읽기 및 팬텀 읽기는 이 수준에서 계속 발생하도록 허용됩니다.
TRANSACTION_REPEATABLE_READ: Repeatable Read(MySQL 기본값), 다른 트랜잭션이 이 데이터를 변경하더라도 해당 데이터를 두 번 볼 수 없음을 나타냅니다. 쿼리되는 내용이 다릅니다. 그러나 유령 읽기는 여전히 발생합니다.
TRANSACTION_SERIALIZABLE: Serialization은 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 방지하는 가장 높은 트랜잭션 격리 수준입니다. 직렬 실행은 동시성 기능이 가장 낮은 단일 스레드 작업과 동일합니다.
트랜잭션 격리 수준이 높을수록 충돌을 피하기 위해 더 많은 성능이 사용됩니다. 즉, 효율성이 낮습니다. "반복 읽기" 수준에서는 실제로 가상 읽기 문제의 일부를 해결할 수 있지만 업데이트 업데이트로 인해 발생하는 가상 읽기 문제를 방지할 수는 없습니다.
MySQL 클라이언트는 기본적으로 반복 읽기 수준에서 작동합니다.
2. TRANSACTION_READ_UNCOMMITTED 격리 수준 테스트
이때 클라이언트 A가 롤백되면 데이터베이스에서 zhangsan의 수명이 복원됩니다. 에 20, 클라이언트 B가 이미 21을 사용하여 비즈니스를 수행했기 때문에 지금은 너무 늦었습니다.
두 클라이언트 모두 롤백하고 현재 트랜잭션의 데이터 수정 사항을 취소하며 zhangsan의 나이는 20
으로 복원됩니다. 3. TRANSACTION_READ_COMMITTED 격리 수준을 테스트합니다.
왜냐하면 그것은 제출된 읽기 격리 수준으로 설정되므로 트랜잭션 B에서 더티 읽기가 발생하지 않습니다. 이는 다양한 잠금 메커니즘과 트랜잭션 동시성의 MVCC 버전 제어를 통해 달성됩니다.
커밋된 읽기 격리 수준에서 커밋된 데이터를 쿼리하면 반복 불가능한 읽기가 발생할 수 있으며 이는 허용됩니다. 반복 불가능한 읽기가 발생했기 때문에 가상 읽기가 확실히 발생할 수 있습니다.
4. TRANSACTION_REPEATABLE_READ 격리 수준 테스트
어떤 의미에서 반복 가능한 읽기는 팬텀 읽기 발생을 방지할 수 있습니다. 현재 반복 가능한 읽기 격리 수준이 삽입 작업을 방지하기 때문입니다. 반복 읽기 격리 수준은 삽입 및 삭제 작업을 방지할 수 있지만 업데이트 작업을 방지할 수는 없습니다.
실제로 트랜잭션 A가 삽입되어 제출되었는데, 트랜잭션 B가 aaa의 연령을 성공적으로 업데이트했기 때문에 aaa는 이미 존재합니다.
전후에 동일한 쿼리를 두 번 실행했을 때 데이터 볼륨이 다른 경우에는 팬텀이 발생합니다. 읽기가 발생합니다. 팬텀 읽기 문제를 완전히 해결하려면 반복 읽기 격리 수준에서는 격리 수준을 직렬화로 높여야 합니다
5. TRANSACTION_SERIALIZABLE 격리 수준
을 테스트하세요.
현상으로 판단하면, 팬텀 읽기를 해결할 수 있습니다. 다른 테이블에 데이터를 삽입하면 동일한 조건에서 쿼리가 차단됩니다. 트랜잭션 B가 데이터를 다시 쓰면 차단됩니다. 읽기 및 읽기는 허용하지만 읽기 및 쓰기 또는 쓰기는 허용하지 않는 읽기-쓰기 잠금으로 구현됨)
MySQL 서버는 트랜잭션을 실행하는 스레드가 영원히 차단되도록 허용하지 않으므로 현재 스레드가 차지하는 잠금이 불가능하게 됩니다. 해제되어 다른 트랜잭션이 실행됩니다. 스레드가 잠금을 얻을 수 없어 영원히 차단됩니다. 트랜잭션을 실행하는 스레드가 너무 오랫동안 기다리면 시간 초과 메커니즘이 트리거되어 스레드가 잠금을 해제하고 오류를 반환하게 됩니다
위 내용은 MySQL 트랜잭션의 격리 수준은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!