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:
这时,事务A要发起一次查询操作,就会生成一个ReadView
这时事务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를 기반으로 RC를 구현하는 방법은 무엇일까요? 핵심 설계: 트랜잭션이 RC를 설정하면 쿼리를 시작할 때마다 ReadView가 다시 생성됩니다! 🎜🎜🎜데이터베이스에 트랜잭션 ID=50인 데이터 행이 있습니다. 오래 전에 삽입되었습니다. 현재 활성 트랜잭션은 🎜🎜🎜🎜🎜트랜잭션 A(ID=60) 🎜입니다. 🎜🎜🎜트랜잭션 B (id=70) 🎜🎜🎜🎜🎜이제 트랜잭션 B는 업데이트를 시작하고 이 데이터를 b로 업데이트하므로 이때 데이터의 trx_id는 트랜잭션 B의 id=70이 되고 실행 취소가 됩니다. 로그가 동시에 생성됩니다: 🎜🎜🎜🎜🎜이때 트랜잭션 A가 쿼리 작업을 시작하려는 경우 ReadView를 생성합니다🎜🎜🎜🎜이때 트랜잭션 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!