MySQL의 4가지 트랜잭션 격리 수준

coldplay.xixi
풀어 주다: 2020-12-15 10:24:29
앞으로
2021명이 탐색했습니다.

mysql tutorial 열에는 4가지 트랜잭션 격리 수준이 소개됩니다.

MySQL의 4가지 트랜잭션 격리 수준

권장(무료): mysql tutorial

이 기사의 실험을 위한 테스트 환경: Windows 10+cmd+MySQL 5.6 . 36 +InnoDB

1. 트랜잭션의 기본 요소(ACID)

  1. 원자성: 트랜잭션이 시작된 후 모든 작업이 완료되거나 완료되지 않으며 중간에 정체가 불가능합니다. 링크. 트랜잭션 실행 중 오류가 발생하면 트랜잭션이 시작되기 전 상태로 롤백되어 모든 작업이 발생하지 않은 것처럼 처리됩니다. 즉, 물질의 기본 단위인 화학에서 배운 원자와 마찬가지로 사물은 분할할 수 없는 전체입니다.

  2. 일관성: 트랜잭션 시작 및 종료 전후에 데이터베이스의 무결성 제약 조건을 위반하지 않습니다. 예를 들어, A가 B에게 돈을 이체하면 A는 돈을 공제할 수 없지만 B는 돈을 받지 못합니다.

3. 격리: 동시에 하나의 트랜잭션만 동일한 데이터를 요청할 수 있으며 서로 다른 트랜잭션 간에 간섭이 없습니다. 예를 들어, A는 은행 카드에서 돈을 인출하고 있습니다. B는 A의 인출 절차가 완료되기 전에는 이 카드로 돈을 이체할 수 없습니다.

  4. 내구성: 트랜잭션이 완료된 후 트랜잭션으로 인해 데이터베이스에 대한 모든 업데이트가 데이터베이스에 저장되며 롤백할 수 없습니다.

2. 트랜잭션 동시성 문제

1. 더티 읽기: 트랜잭션 A가 트랜잭션 B가 업데이트한 데이터를 읽은 다음 B가 작업을 롤백하고 A가 읽은 데이터가 더티 데이터입니다.

2 반복 불가능 읽기: 트랜잭션 A는 동일한 데이터를 여러 번 읽고, 트랜잭션 B는 트랜잭션 A를 여러 번 읽는 동안 데이터를 업데이트하고 커밋합니다. 따라서 트랜잭션 A가 동일한 데이터를 여러 번 읽으면 결과가 일치하지 않습니다.

 3. 가상 읽기: 시스템 관리자 A가 데이터베이스 내 모든 학생의 성적을 특정 점수에서 ABCDE 등급으로 변경했지만 시스템 관리자 B는 이때 특정 점수의 기록을 삽입했습니다. 수정 후 시스템 관리자. 마치 환각에 빠진 것처럼 아직 수정되지 않은 기록이 하나 남아 있는 것을 발견했습니다.

요약: 비반복 읽기와 환상 읽기는 쉽게 혼동됩니다. 비반복 읽기는 수정에 중점을 두고, 환상 읽기는 추가 또는 삭제에 중점을 둡니다. 반복 불가능 문제를 해결하려면 조건을 충족하는 행만 잠그면 됩니다. 팬텀 읽기 문제를 해결하려면 테이블을 잠그면 됩니다. 3. MySQL 트랜잭션 격리 수준

트랜잭션 격리 level dirty read 읽기 Read-uncommittedYesYesYesNonrepeatable Read-committedNoYesYes반복 읽기(반복 가능- 읽기)아니요아니요예직렬화 가능(직렬화 가능)No아니요아니요

MySQL의 기본 트랜잭션 격리 수준은 반복 읽기입니다

IV. 예제를 사용하여 각 격리 수준을 설명합니다

 1. 커밋되지 않은 읽기:

    (1) 클라이언트 A를 열고 커밋되지 않은 읽기의 경우 현재 트랜잭션 모드를 설정합니다. 커밋되지 않은 읽기) 테이블 계정의 초기 값을 쿼리합니다.

   (2) 클라이언트 A의 트랜잭션이 커밋되기 전에 다른 클라이언트 B를 열고 테이블 계정을 업데이트합니다.

(3) 이때, 클라이언트 B의 트랜잭션이 아직 제출되지 않았지만 클라이언트 A는 B의 업데이트된 데이터를 쿼리할 수 있습니다.

    (4) 클라이언트 B의 트랜잭션이 어떤 이유로 롤백되면 모든 작업이 취소되고 클라이언트 A가 데이터를 쿼리합니다. 실제로 더티 데이터입니다:

     (5) 클라이언트 A 업데이트 계정에서 업데이트 문을 실행합니다. 업데이트 계정은 잔액 = 잔액 - 50으로 설정됩니다. 여기서 id =1 , lilei의 잔액은 350이 아니고 실제로 400입니다. 이상하지 않나요? 데이터가 일치하지 않는다고 생각한다면 너무 순진한 생각입니다. 애플리케이션에서는 400-50=350을 사용하고 다른 세션에 대해서는 알 수 없습니다. 이 문제를 해결하려면 다음을 사용하세요. 커밋된 격리 수준 읽기

 2. 커밋된 읽기

   (1) 클라이언트 A를 열고 현재 트랜잭션 모드를 커밋된 읽기(커밋된 읽기(가져오기), 계정 테이블의 모든 레코드 쿼리:

)로 설정합니다. ㅠㅠ                                           uffer 2| 클라이언트 B의 트랜잭션은 아직 제출되지 않았으며 클라이언트 A는 클라이언트 B의 업데이트된 데이터를 쿼리할 수 없습니다. 이는 더티 읽기 문제를 해결합니다.

     (4) 클라이언트 B의 거래는 다음과 같습니다. submit

    (5) 클라이언트 A는 이전 단계와 동일한 쿼리를 실행했지만 결과가 이전 단계와 일치하지 않아 반복 불가능 읽기 문제가 발생함

3. 반복 읽기

( 1) 클라이언트 A를 열고 현재 트랜잭션 모드를 반복 읽기로 설정하고 테이블 계정의 모든 레코드를 쿼리합니다.                                ulous U in Query 계정 테이블의 모든 레코드를 쿼리하고 쿼리 결과는 (1) 단계와 일치합니다. .반복 불가능한 읽기 문제는 없습니다

    (4) 클라이언트 A에서 업데이트 잔액 = 잔액 - 50을 실행합니다. 여기서 id = 1, 잔액은 400-50=350으로 변경되지 않았습니다. (2)단계에서 350을 이용하여 계산하였으므로 300이다. 데이터의 일관성은 훼손되지 않았다. MVCC 메커니즘은 반복 가능한 읽기 격리 수준에서 사용됩니다. 선택 작업은 버전 번호를 업데이트하지 않지만 스냅샷 읽기(기록 버전)이며 버전 번호를 업데이트하며 현재 읽기입니다. 버전).

(5) 클라이언트 B를 다시 열고 새 데이터를 삽입한 후 제출

(6) 클라이언트 A의 계정 테이블에 있는 모든 레코드를 쿼리합니다. 새 데이터가 발견되지 않으므로 환상이 없습니다. . 읽어보세요

  4. 직렬화

                                                          에 포함됨

   (2) 클라이언트 B를 열고 현재 트랜잭션 모드를 직렬화 가능으로 설정합니다. 레코드를 삽입하면 오류가 보고됩니다. mysql의 트랜잭션 격리 수준이 직렬화되면 테이블이 잠깁니다. 잠겨 있으므로 팬텀 읽기가 발생하지 않습니다. 이 격리 수준은 동시성이 매우 낮으며 개발에 거의 사용되지 않습니다.

  보충:

  1. 트랜잭션 격리 수준이 읽기 커밋인 경우 쓰기 데이터는 해당 행만 잠급니다.

  2 트랜잭션 격리 수준이 반복 읽기인 경우 검색 조건에 인덱스가 있는 경우 (기본 키 인덱스 포함) 기본 잠금 방법은 다음 키 잠금입니다. 검색 조건에 인덱스가 없으면 데이터 업데이트 시 전체 테이블이 잠깁니다. 트랜잭션에 의해 간격이 잠기고 다른 트랜잭션이 이 간격에 레코드를 삽입할 수 없으므로 팬텀 읽기가 방지됩니다.

3. 트랜잭션 격리 수준이 직렬화인 경우 데이터를 읽고 쓰면 전체 테이블이 잠깁니다.

4 격리 수준이 높을수록 데이터의 완전성과 일관성이 보장될 수 있지만 동시성 성능에 미치는 영향도 더 큽니다.

5. MYSQL MVCC 구현 메커니즘에 대한 참조 링크: https://blog.csdn.net/whoamiyang/article/details/51901888

6. 다음 키 잠금의 경우 링크 참조 : https://blog.csdn.net/bigtree_3721/article/details/73731377

위 내용은 MySQL의 4가지 트랜잭션 격리 수준의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿