>데이터 베이스 >MySQL 튜토리얼 >데이터베이스 트랜잭션 격리 수준과 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 이해하는 방법

데이터베이스 트랜잭션 격리 수준과 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 이해하는 방법

坏嘻嘻
坏嘻嘻원래의
2018-09-15 11:36:363143검색

이 문서의 내용은 데이터베이스 트랜잭션 격리 수준과 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 이해하는 방법에 대한 내용입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다. 너.

1. 데이터베이스 트랜잭션의 올바른 실행을 위한 4가지 기본 요소

1.1 ACID 원칙.

  ACID 원칙은 데이터베이스 트랜잭션의 정상적인 실행을 위한 네 가지 기본 요소로 원자성, 일관성, 독립성 및 내구성을 나타냅니다.

  트랜잭션의 원자성(원자성)은 트랜잭션이 완전히 실행되거나 실행되지 않음을 의미합니다. 즉, 트랜잭션이 중간에 실행되고 중지될 수는 없습니다. , 이 거래는 두 단계로 나눌 수 있습니다: 1. 카드를 긁는 것, 2. 돈을 인출하는 것. 카드를 긁어도 돈이 나오지 않을 수 있습니다. 이 두 단계는 동시에 완료되어야 합니다. 그렇지 않으면 전혀 완료되지 않습니다.

트랜잭션 일관성(일관성)은 트랜잭션 작업이 데이터베이스에 있는 데이터의 일관성을 변경하지 않는다는 것을 의미합니다. 예를 들어 무결성 제약조건 a+b=10에서 트랜잭션이 a를 변경하면 b도 그에 따라 변경되어야 합니다. 즉, A가 B에게 300위안을 송금하면 A의 계좌는 300위안이 줄어들고, B의 계좌는 300위안이 늘어나야 하는 등 200위안 등의 증감이라고 할 수 없습니다. . 이는 트랜잭션 원자성과 일치하지만 트랜잭션 일관성을 준수하지 않습니다. 실제 비즈니스에서는 물건을 구매할 때 재고를 차감하는 것과 유사한 논리인 경우가 많습니다. 그러면 설계 결함으로 인해 메인 테이블에 재고가 있고, 재고 테이블에 재고가 있습니다. , 거래가 추가되더라도 여전히 나타납니다. 이는 과판매 및 SKU 재고가 전체 재고와 일치하지 않는 문제를 해결하기 위해 일관성이 만족되지 않음을 의미합니다.

  독립성(격리): 트랜잭션의 독립성을 격리라고도 합니다. 이는 두 개 이상의 트랜잭션이 인터리브된 상태로 실행되지 않음을 의미합니다. 이는 데이터 불일치로 이어질 수 있기 때문입니다.

  지속성(지속성): 트랜잭션이 커밋되거나 롤백되면 격리로 인해 발생할 수 있는 읽기 문제에 관계없이 이 상태가 데이터베이스에 지속되어야 합니다.


1.2 더티 읽기, 반복 불가능 읽기, 팬텀 읽기.

Dirty read(더티 읽기): 다른 트랜잭션에서 커밋되지 않은 한 트랜잭션의 데이터를 읽습니다. 예를 들어, 트랜잭션이 데이터에 액세스하고 데이터를 수정했지만 수정 사항이 아직 데이터베이스에 커밋되지 않은 경우 다른 트랜잭션도 데이터에 액세스한 다음 해당 데이터를 사용합니다.

  NonRepeatable Read(NonRepeatable Read): 동일한 데이터 내용을 읽을 수 없습니다. 이는 트랜잭션 내에서 동일한 데이터가 여러 번 읽혀지는 것을 의미합니다. 그런 다음 두 트랜잭션 사이의 수정으로 인해 첫 번째 트랜잭션의 두 데이터 읽기 사이에 다른 트랜잭션도 동일한 데이터에 액세스하고 이를 수정합니다. 첫 번째 트랜잭션에서 두 번 읽은 데이터는 다를 수 있습니다.

  Phantom Read(Phantom Read): 트랜잭션에서 두 쿼리의 결과가 일치하지 않습니다(삽입 작업의 경우). 트랜잭션이 독립적으로 실행되지 않을 때 발생하는 현상을 말합니다. 예를 들어 첫 번째 트랜잭션이 테이블의 데이터를 수정하는데, 이 수정에는 테이블의 모든 데이터 행이 포함됩니다. 동시에 두 번째 트랜잭션도 이 테이블의 데이터를 수정합니다. 이 수정으로 인해 테이블에 새 데이터 행이 삽입됩니다. 그러다가 첫 번째 트랜잭션을 수행한 사용자가 테이블에 수정되지 않은 데이터 행이 아직 남아 있음을 발견하면 이는 착각과 같습니다.
 예를 들어, 편집자는 작성자가 제출한 문서를 변경했지만 프로덕션에서 변경 사항을 문서의 마스터 사본에 병합할 때 작성자가 편집되지 않은 새 자료를 문서에 추가한 것으로 밝혀졌습니다. 편집자와 제작 부서가 원본 문서 작업을 마칠 때까지 누구도 문서에 새 자료를 추가할 수 없다면 이 문제를 피할 수 있습니다.


2. 데이터베이스 트랜잭션 격리 수준

데이터베이스 트랜잭션에는 낮은 수준부터 높은 수준까지 4가지 격리 수준이 있습니다. 커밋되지 않은 읽기(커밋되지 않은 읽기), 커밋된 읽기(커밋된 읽기), 반복 가능한 읽기(반복 가능한 읽기), 직렬화 가능( 직렬화), 이 네 가지 수준은 더티 읽기, 반복 불가능 읽기 및 팬텀 읽기 문제를 하나씩 해결할 수 있습니다.

2.1 Read uncommitted

 회사에서 급여를 지급했는데 리더가 5,000위안을 singo의 계좌로 이체했는데 거래가 제출되지 않았고 singo가 우연히 계좌를 확인해보니 급여가 5,000위안인 것을 알게 되어서 매우 기뻤습니다. 불행하게도 리더는 singo에게 지급되는 급여가 2,000위안이어야 한다는 것을 알고 신속하게 거래를 롤백(5,000위안으로 롤백)하고 금액을 수정(2,000위안)한 후 마침내 거래를 제출했습니다. 실제로 singo는 급여를 제출했습니다. 가격은 2,000위안이고 Singo는 만족합니다.

 위의 상황이 발생합니다. 이는 더티 읽기(dirty reading), 두 개의 동시 트랜잭션, "트랜잭션 A: 리더가 singo에 급여를 지불합니다", "트랜잭션 B: singo가 급여 계정을 쿼리합니다", 트랜잭션 B는 트랜잭션 A를 읽었지만 읽지 않았습니다. 아직 데이터를 제출했습니다.

 격리 수준을 Read uncommitted(read uncommitted)로 설정한 경우 더티 읽기가 발생할 수 있습니다. 이때 격리 수준을 Read commit(read commit)으로 높이면 더티 읽기를 방지할 수 있습니다.


2.2 읽기 완료

singo는 자신의 급여 카드를 가지고 물건을 구매했는데 시스템에 실제로 카드에 2,000위안이 있는 것으로 확인되었습니다. 이때 그녀의 아내는 우연히 온라인으로 돈을 이체하고 있었고 singo의 급여 카드에서 2,000위안을 다른 계좌로 이체했습니다. 싱고가 돈을 공제할 때 시스템에서 싱고의 급여카드에 돈이 없는 것을 확인했고, 싱고는 카드에 돈이 있어서 어떻게 됐는지 의아해했습니다.

  위의 상황이 발생하는데, 이를 반복 불가능 읽기라고 하며 두 개의 동시 트랜잭션, "거래 A: singo 소비", "거래 B: singo 아내 온라인 전송", 트랜잭션 A가 미리 데이터를 읽었고, 트랜잭션 B 데이터를 업데이트하고 트랜잭션을 커밋한 직후 트랜잭션 A가 데이터를 다시 읽으면 데이터가 변경되었습니다.

 격리 수준을 읽기 커밋으로 설정하면 더티 읽기는 방지되지만 반복 불가능한 읽기가 발생할 수 있습니다(동일한 데이터 콘텐츠를 읽을 수 없음).

  Sql Server, Oracle 등 대부분의 데이터베이스의 기본 수준은 읽기 커밋입니다. 이때 격리 수준을 반복 읽기로 높이면 더티 읽기 및 반복 불가능 읽기를 피할 수 있습니다.


2.3 반복 읽기

 격리 수준을 반복 읽기로 설정하면 반복 불가능 읽기를 피할 수 있습니다. singo가 급여 카드를 가져와 소비할 때 시스템이 급여 카드 정보를 읽기 시작하면(즉, 거래가 시작됨) singo의 아내는 기록을 수정할 수 없습니다. 즉, singo의 아내는 이때 돈을 이체할 수 없습니다.

   (여기 두 블로그의 예시는 서로 다릅니다. 이유를 명시해 주세요.) 즉, 세션 A와 B가 있고 각각 두 개의 거래가 열리고 A가 B에게 500위안을 이체한 후 A가 이체합니다. 트랜잭션을 제출한 후 B는 다시 확인하여 여전히 원래 금액임을 확인합니다. B는 현재 트랜잭션을 종료하고 새 트랜잭션을 시작하여 데이터 변경 사항을 쿼리할 수 있으므로 반복 불가능한 읽기를 방지할 수 있습니다. Seriized(직렬화)를 설정하면 테이블을 잠그는 것과 동일하며 특정 시간에 하나의 트랜잭션만 테이블에 액세스할 수 있습니다.

 반복 읽기는 반복 불가능한 읽기를 방지하지만 팬텀 읽기는 여전히 발생할 수 있습니다.

 예를 들어 싱고의 아내는 은행 부서에 근무하는데, 싱고의 신용카드 사용 내역을 은행 내부 시스템을 통해 자주 확인합니다. 어느 날 그녀는 그 달의 싱고 신용카드 총 소비 금액(월=이번 달의 거래에서 선택 금액)이 80위안인지 확인하고 있었습니다. 이때 싱고는 우연히 밖에서 식사를 하고 요금을 지불하고 있었습니다. 계산대에서 1,000위안, 즉 1,000위안(거래 삽입...)의 새로운 소비 기록이 추가되고 거래가 제출되었습니다. 그러자 신고의 아내는 신고의 해당 월 신용카드 소비 내역을 A4 용지에 인쇄했습니다. 그런데 총 소비량이 1,080위안이라는 걸 알게 됐고, 아내는 환각에 빠진 줄 알고 매우 놀랐고, 이렇게 환상 판독이 이뤄졌다.

 참고: Mysql의 기본 격리 수준은 반복 읽기입니다.


2.4 직렬화 가능(Serialization)
직렬화 가능(Serialization)은 가장 높은 트랜잭션 격리 수준이며 가장 비싸고 성능도 매우 낮습니다. 이 수준에서는 일반적으로 트랜잭션이 순차적으로 실행되는 경우가 거의 없습니다. 더티 읽기(dirty read), 반복 불가능한 읽기, 팬텀 읽기(phantom read)를 피하는 것뿐만 아니라.


3. 요약

3.1 격리 수준 및 해당 가능한 문제 읽기)

불가능불가능
커밋되지 않은 읽기(커밋된 읽기) possible possible possible
读未提交(Read uncommitted) 可能 可能 可能
读已提交(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
序列化가능 가능 반복 읽기(반복 읽기)
가능🎜🎜🎜🎜직렬화(직렬화 가능) )🎜 🎜불가능🎜🎜불가능🎜🎜불가능🎜🎜🎜🎜

위 내용은 데이터베이스 트랜잭션 격리 수준과 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.