MVCC read view的问题
之前写了一篇文章以为对MVCC的大致原理有些了解了。今天看了《高性能MySQL》的时候,深究了一下read view的问题,发现还是蛮有意思的。 特别画了一张图来确认一下。 本文是上一篇MySQL事务和MVCC简介的后续,建议先了解上一篇文章以后再阅读本文。 上一篇文
之前写了一篇文章以为对MVCC的大致原理有些了解了。今天看了《高性能MySQL》的时候,深究了一下read view的问题,发现还是蛮有意思的。
特别画了一张图来确认一下。
本文是上一篇MySQL事务和MVCC简介的后续,建议先了解上一篇文章以后再阅读本文。
上一篇文章简单描述了MVCC的相关情况,但是没有详细说,read view是什么结构,并且它到底是怎么工作的。
比如,我们在show engine innodb status可以看到如下内容:
- ? —TRANSACTION 0 600, ACTIVE 4 sec, process no 3396, OS thread id 1148250464, thread declared inside InnoDB 442
- ? mysql tables in use 1, locked 0
- ? MySQL thread id 8079, query id 728899 localhost baron Sending data
- ? select sql_calc_found_rows * from b limit 5
- ? Trx read view will not see trx with id>= 0 601, sees
要理解这个,我们首先要知道:
read view其实就是一个保存事务ID的list列表。记录的是本事务执行时,MySQL还有哪些事务在执行。
Read Repeatable(下文和图中用RR表示)对应的是在每个事务启动的时候创建 一个Read View。
Read Commit(下文和图中用RC表示)对应的是每次执行SQL statement时候创建?一个Read View。
根据show engine innodb status的输出是说看到这个事务的id是600。
对这个事务来说,trx id为596以下的所有事务修改的行数据,这个事务都可以看到,
trx id在601以上的事务修改的数据,这个事务都不应该读取到。
596到601号事务,一共5个事务修改的数据无法确定是否能够读取。read view应该为这5个事务id集合的子集。
如果线程的隔离级别是RR:
按照show engine innodb status的输出,600号事务在事务启动的时候,MySQL告诉它:
596之前的所有事务都已经提交了(Trx read view will not see trx with id>= 0 601, sees ),
由于事务本身是600号,那么对应的601号事务因为是在它后面启动的,600号事务肯定无法提供读取到数据(Trx read view will not see trx with id>= 0 601,?sees
read view表示的是事务开始时MySQL还有哪些事务在执行,就应该为{596,597,598,599}集合的子集,假设为{596,598},
根据read view,Innodb在读取数据的时候需要判断该行数据的修改事务号,判断的方法为:
a)?如果行数据的修改事务号小于596,由于在事务启动的时候596之前的所有线程都已经提交了,那么该行数据可读。
b) 如果行数据的修改事务号大于601,那么该行数据肯定不可读。如果事务号为600(即自己),本事务未提交,当然也是不可读的。
为了保证在事务内任何时间读取的数据都是一致的,需要根据行数据的undo信息回溯,每次回溯都需要进行a),b),c),d)的判断,直到找到一个可读的数据。
c) 如果行数据的修改事务号在read view里面{596,599},说明是该事务(600号)开始时没有提交的数据修改,
为了保证在事务内任何时间读取的数据都是一致的,需要根据行数据的undo信息回溯,每次回溯都需要进行a),b),c),d)的判断,直到找到一个可读的数据。
d)如果不在read view里面,即事务id号在{597,598}中,说明修改行数据是该事务(600号)开始时已经提交的数据修改,那么该行数据可读。
图1 MySQL read view 示意图
如图1。这个事务的行修改数据在{[0~595],597,598}是可读区间,{596,599,600,[601~ +infinity]}是不可读区间。
如果线程的隔离级别是RC,线程开始的时候,RC事务并不会做read view,此时开始的SQL跟上面RR的情况可能是一样的。
但是过了一段时间如果601事务提交了,同样的查询,在RC下面提交,对应的show engine innodb status的信息可能稍微有点不同:
- ? —TRANSACTION 0?600, ACTIVE 4 sec, process no 3396, OS thread id 1148250464, thread declared inside InnoDB 442
- ? mysql tables in use 1, locked 0
- ? MySQL thread id 8079, query id 728899 localhost baron Sending data
- ? select sql_calc_found_rows * from b limit 5
- ??Trx read view will not see trx with id>= 0 602, sees
按照输出,600号事务在语句“select sql_calc_found_rows * from b limit 5”发起的时候,MySQL告诉它:
596之前的所有事务都已经提交了(Trx read view will not see trx with id>= 0 601,?sees ),
对应的,602号线程以及它之后的所有线程都还未提交(Trx read view?will not see trx with id>= 0 602,?sees
read view表示的是语句开始时MySQL还有哪些事务在执行(注意,这里跟RR为事务开始的时候的read view不同了),
在一个事务里面,每个SQL执行的时候,它的read view都可能是不同的。有可能事务启动的时候的sql的read view为{596,598},
这个语句执行的时候,601事务提交了,read view为{596,598}。
注意,601号事务虽然在600事务后启动,此时已经提交了行数据修改,它修改的数据,600号线程也可以读到。
根据read view,InnoDB在读取数据的时候需要判断该行数据的修改事务号,判断的方法为:
a)?如果行数据的修改事务号小于596,由于在语句启动的时候596之前的所有线程都已经提交了,那么该行数据可读。
b) 如果行数据的修改事务号大于等于602,那么该行数据肯定不可读。如果事务号为600(即自己),本事务未提交,当然也是不可读的。
为了保证读到的是Commited的数据,需要根据行数据的undo信息回溯,每次回溯都需要进行a),b),c),d)的判断,直到找到一个可读的数据。
c) 如果行数据的修改事务号在read view里面{596,599},说明是该语句开始时没有提交的数据修改,
为了保证读到的是Commited的数据,需要根据行数据的undo信息回溯,每次回溯都需要进行a),b),c),d)的判断,直到找到一个可读的数据。
d)如果不在read view里面,即事务id号在{597,598}中,说明修改行数据是该语句开始时已经提交的数据修改,那么该行数据可读。
如图1。这个语句的修改行数据的事务id在{[0~595],597,598,601}是可读区间,{596,599,600,[602~ +infinity]}是不可读区间。
整体来说,这篇文章描述了在Read Readrepeatable和Read Commit环境下,MySQL根据Read View读取数据的方法,来保证可重复读和只读到已经提交的数据。
原文地址:MVCC read view的问题, 感谢原作者分享。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

1. 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있습니까? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 1. 기본 권익 활성화: 기사의 원본은 광고를 통해 수익을 얻을 수 있으며, 동영상은 가로 화면 모드에서 원본이어야 수익을 얻을 수 있습니다. 2. 팬 100명 권리 활성화: 팬 수가 100명 이상에 도달하면 마이크로 헤드라인, 오리지널 Q&A 작성, Q&A 수익을 얻을 수 있습니다. 3. 독창적인 작품을 고집하라: 독창적인 작품에는 기사, 마이크로 헤드라인, 질문 등이 포함되며, 300단어 이상이어야 합니다. 불법 표절 저작물을 원작으로 출판할 경우 크레딧 점수가 차감되며, 수익금도 차감되므로 주의하시기 바랍니다. 4. 수직성: 전문 분야에서 기사를 작성할 때 분야를 넘나들며 마음대로 기사를 작성할 수 없으며 적절한 추천을 받을 수 없으며, 작품의 전문성과 정확성을 확보할 수 없으며 팬을 유치하기가 어렵습니다. 그리고 독자들. 5. 활동: 높은 활동,

클러스터링 알고리즘에서 클러스터링 효과 평가 문제에는 특정 코드 예제가 필요합니다. 클러스터링은 데이터를 클러스터링하여 유사한 샘플을 하나의 범주로 그룹화하는 비지도 학습 방법입니다. 클러스터링 알고리즘에서는 클러스터링의 효과를 어떻게 평가하는가가 중요한 문제입니다. 이 기사에서는 일반적으로 사용되는 몇 가지 클러스터링 효과 평가 지표를 소개하고 해당 코드 예제를 제공합니다. 1. 클러스터링 효과 평가 지수 실루엣 계수 실루엣 계수는 표본의 근접성 및 다른 클러스터와의 분리 정도를 계산하여 클러스터링 효과를 평가합니다.

강력한 성능과 다재다능한 기능으로 잘 알려진 iPhone은 복잡한 전자 장치에서 흔히 발생하는 문제인 가끔씩 발생하는 문제나 기술적인 어려움으로부터 자유롭지 않습니다. iPhone 문제를 경험하면 실망스러울 수 있지만 일반적으로 알람은 필요하지 않습니다. 이 종합 가이드에서는 iPhone 사용과 관련하여 가장 일반적으로 직면하는 문제 중 일부를 쉽게 설명하는 것을 목표로 합니다. 당사의 단계별 접근 방식은 이러한 일반적인 문제를 해결하는 데 도움을 주고 장비를 최상의 작동 순서로 되돌릴 수 있는 실용적인 솔루션과 문제 해결 팁을 제공하도록 설계되었습니다. 결함이 있거나 더 복잡한 문제에 직면하더라도 이 문서는 문제를 효과적으로 해결하는 데 도움이 될 수 있습니다. 일반적인 문제 해결 팁 특정 문제 해결 단계를 진행하기 전에 다음은 몇 가지 유용한 정보입니다.

jQuery.val()을 사용할 수 없는 문제를 해결하려면 구체적인 코드 예제가 필요합니다. 프론트 엔드 개발자에게는 jQuery를 사용하는 것이 일반적인 작업 중 하나입니다. 그중에서도 .val() 메서드를 사용하여 양식 요소의 값을 가져오거나 설정하는 것은 매우 일반적인 작업입니다. 그러나 특정한 경우에는 .val() 메서드를 사용하지 못하는 문제가 발생할 수 있습니다. 이 문서에서는 몇 가지 일반적인 상황과 해결 방법을 소개하고 구체적인 코드 예제를 제공합니다. 문제 설명 jQuery를 사용하여 프런트 엔드 페이지를 개발할 때 때때로 다음과 같은 문제가 발생할 수 있습니다.

"리눅스 읽기 명령의 기본 기능과 조작 기술을 익히세요" 리눅스 시스템에서 읽기 명령은 표준 입력에서 데이터를 읽는 데 매우 유용한 명령입니다. 읽기 명령을 통해 사용자는 대화형으로 데이터를 입력하거나 후속 처리를 위해 변수에 데이터를 저장할 수 있습니다. 이 기사에서는 읽기 명령의 기본 기능과 작동 기술을 살펴보고 독자가 이 명령을 더 잘 이해하고 사용할 수 있도록 구체적인 코드 예제를 제공합니다. 읽기 명령의 기본 사용법 읽기 명령

약한 지도 학습의 라벨 획득 문제에는 특정 코드 예제가 필요합니다. 소개: 약한 지도 학습은 훈련에 약한 라벨을 사용하는 기계 학습 방법입니다. 기존 지도 학습과 달리 약한 지도 학습은 각 샘플에 정확한 라벨이 필요한 것이 아니라 모델을 훈련하는 데 더 적은 수의 라벨만 사용하면 됩니다. 그러나 약한 지도 학습에서는 약한 레이블로부터 유용한 정보를 정확하게 얻는 방법이 핵심 문제입니다. 이 기사에서는 약한 지도 학습의 레이블 획득 문제를 소개하고 구체적인 코드 예제를 제공합니다. 약한 지도 학습의 라벨 획득 문제 소개:

[리눅스 읽기 명령을 사용하여 파일 내용을 읽는 방법] 리눅스 시스템에서 읽기는 표준 입력이나 파일에서 데이터를 읽는 데 사용되는 명령입니다. 읽기 명령을 사용하면 사용자가 파일 내용을 빠르게 얻고 후속 처리를 수행하는 데 도움이 될 수 있습니다. 다음에서는 특정 코드 예제를 포함하여 Linuxread 명령을 사용하여 파일 내용을 읽는 방법을 자세히 소개합니다. 파일 내용 읽기 파일 내용을 읽으려면 먼저 터미널을 열고 다음 명령 형식을 사용하여 파일 내용을 읽어야 합니다.

기계 학습 모델의 일반화 기능에는 특정 코드 예제가 필요합니다. 기계 학습의 개발 및 적용이 점점 더 널리 보급됨에 따라 사람들은 기계 학습 모델의 일반화 기능에 점점 더 많은 관심을 기울이고 있습니다. 일반화 능력은 레이블이 지정되지 않은 데이터에 대한 기계 학습 모델의 예측 능력을 의미하며, 현실 세계에서 모델의 적응성으로도 이해될 수 있습니다. 좋은 머신러닝 모델은 높은 일반화 능력을 갖추고 새로운 데이터에 대해 정확한 예측을 할 수 있어야 합니다. 그러나 실제 응용에서는 훈련 세트에서는 잘 수행되지만 테스트 세트에서는 실패하거나 실제 모델에서 실패하는 모델을 자주 접하게 됩니다.
