MySQL이 RC 트랜잭션 격리를 구현하는 방법

PHPz
풀어 주다: 2023-05-28 15:04:49
앞으로
1628명이 탐색했습니다.

ReadView 메커니즘은 실행 취소 로그 버전 체인을 기반으로 하는 읽기 보기 메커니즘입니다. 각 트랜잭션은 ReadView를 생성합니다

  • 데이터가 트랜잭션 자체에 의해 업데이트되면 직접 읽거나

  • 생성할 수 있습니다. ReadView이전에 제출한 트랜잭션으로 수정된 값도 읽을 수 있습니다ReadView之前提交的事务所修改的值,也可读到

  • 但若你生成ReadView时,就已经活跃的事务,但如果它在你生成ReadView之后修改的数据并提交了,此时你读不到

  • 或你生成ReadView以后再开启的事务修改了数据,还提交了,也读不到

所以上面那套机制就是ReadView的一个原理如何基于ReadView实现RC?核心设计:当一个事务设置RC,他是每次发起查询,都重新生成一个ReadView!

数据库里有一行数据,是事务id=50的一个事务,很久以前就插入的,当前活跃事务:

  • 事务A(id=60)

  • 事务B(id=70)

现在事务B发起update,更新这条数据为b,所以此时数据的trx_id会变为事务B的id=70,同时生成一条undo log:

MySQL이 RC 트랜잭션 격리를 구현하는 방법

这时,事务A要发起一次查询操作,就会生成一个ReadView

MySQL이 RC 트랜잭션 격리를 구현하는 방법

这时事务A发起查询,发现当前这条数据的trx_id=70。即属于ReadView的事务id范围之间,说明是他生成ReadView之前就有这个活跃的事务,是这个事务修改了这条数据的值,但此时事务B还没提交,所以ReadView的m_ids活跃事务列表里,有[60, 70]两个id,此时根据ReadView机制,事务A无法查到事务B修改的值b。

接着就顺着undo log版本链条往下查找,就会找到一个原始值,发现其trx_id是50,小于当前ReadView里的min_trx_id,说明是他生成ReadView之前,就有一个事务插入了这个值并且早就提交了,因此可以查到这个原始值。

假设事务B已提交,这意味着它不再是数据库中的活跃事务。事务A下次再查询,就可以读到事务B修改过的值了。那到底是怎么让事务A能够读到提交的事务B修改过的值呢?

让事务A下次发起查询,再生成一个ReadView,数据库内活跃的事务只有事务A,因此:

  • min_trx_id是60

  • mac_trx_id是71

  • m_ids=60,事务B的id=70不会出现在m_ids

하지만 ReadView를 생성하면 이미 활성화된 트랜잭션이지만 ReadView를 생성한 후 데이터를 변경하면 제출되지 않아 지금은 읽을 수 없습니다

🎜🎜또는 ReadView를 생성한 후 데이터를 수정한 후 트랜잭션을 열고 제출했지만 읽을 수 없습니다. 읽어보세요🎜🎜🎜🎜그러면 위의 메커니즘이 ReadView의 원리인데, ReadView를 기반으로 RC를 구현하는 방법은 무엇일까요? 핵심 설계: 트랜잭션이 RC를 설정하면 쿼리를 시작할 때마다 ReadView가 다시 생성됩니다! 🎜🎜🎜데이터베이스에 트랜잭션 ID=50인 데이터 행이 있습니다. 오래 전에 삽입되었습니다. 현재 활성 트랜잭션은 🎜🎜🎜🎜🎜트랜잭션 A(ID=60) 🎜입니다. 🎜🎜🎜트랜잭션 B (id=70) 🎜🎜🎜🎜🎜이제 트랜잭션 B는 업데이트를 시작하고 이 데이터를 b로 업데이트하므로 이때 데이터의 trx_id는 트랜잭션 B의 id=70이 되고 실행 취소가 됩니다. 로그가 동시에 생성됩니다: 🎜🎜🎜MySQL은 RC 트랜잭션 격리를 어떻게 구현합니까? 🎜🎜이때 트랜잭션 A가 쿼리 작업을 시작하려는 경우 ReadView를 생성합니다🎜🎜MySQL은 RC 트랜잭션 격리를 어떻게 구현합니까?🎜🎜이때 트랜잭션 A가 쿼리를 시작했고 현재 데이터의 trx_id=70을 발견했습니다. 즉, ReadView에 속한 트랜잭션 ID 범위 사이에는 ReadView를 생성하기 전에 이 활성 트랜잭션이 있었다는 의미입니다. 이 트랜잭션이 이 데이터의 값을 수정했지만 트랜잭션 B는 아직 현재 제출되지 않았습니다. ReadView의 m_ids 활성 트랜잭션 목록 여기에는 두 개의 ID [60, 70]가 있습니다. 이때 ReadView 메커니즘에 따르면 트랜잭션 A는 트랜잭션 B가 수정한 값 b를 찾을 수 없습니다. 🎜🎜 그런 다음 실행 취소 로그 버전 체인을 검색하면 원래 값을 찾고 해당 값의 trx_id가 현재 ReadView의 min_trx_id보다 작은 50임을 알 수 있습니다. 이는 ReadView를 생성하기 전에 트랜잭션이 삽입되었음을 의미합니다. 이 값은 오래 전에 제출된 것이므로 원래 값을 찾을 수 있습니다. 🎜🎜트랜잭션 B가 커밋되었다고 가정합니다. 즉, 더 이상 데이터베이스에서 활성 트랜잭션이 아닙니다. 다음에 트랜잭션 A가 쿼리할 때 트랜잭션 B의 수정된 값을 읽을 수 있습니다. 그렇다면 트랜잭션 A는 제출된 트랜잭션 B의 수정된 값을 어떻게 읽을 수 있습니까? 🎜🎜🎜다음번에 트랜잭션 A가 쿼리를 시작하고 ReadView를 생성하도록 하세요. 데이터베이스에서 유일한 활성 트랜잭션은 트랜잭션 A입니다. 따라서 🎜🎜🎜🎜🎜min_trx_id는 60🎜🎜🎜🎜mac_trx_id 는 71🎜🎜🎜🎜m_ids=60이며, 거래 B의 id=70은 m_ids 활성 거래 목록에 표시되지 않습니다🎜🎜🎜🎜여기서 time transaction 다시 이 ReadView를 기반으로 Query하면 이 데이터의 trx_id가 70임을 알 수 있습니다. ReadView의 min_trx_id와 max_trx_id 범위 사이에 있지만 현재 m_ids 목록에는 없으므로 해당 트랜잭션을 나타냅니다. 이 ReadView를 생성하기 전에 B가 제출되었습니다. 쿼리 작업을 수행하면 트랜잭션 B가 수행한 업데이트 작업을 볼 수 있으며 이로 인해 트랜잭션 A가 B 값을 얻게 됩니다. 🎜

위 내용은 MySQL이 RC 트랜잭션 격리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!