Le mécanisme ReadView est un mécanisme de vue en lecture basé sur la chaîne de version du journal d'annulation. Chaque transaction générera un ReadView
Si les données sont mises à jour par la transaction elle-même, vous pouvez la lire vous-même
ou quand. vous le générez ReadView
La valeur modifiée par la transaction soumise auparavant peut également être lueReadView
之前提交的事务所修改的值,也可读到
但若你生成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
puis ouvert la transaction après avoir modifié les données et l'avez soumise, mais vous pouvez. Je ne le lis pas non plus🎜🎜🎜🎜Donc le mécanisme ci-dessus C'est un principe de ReadView
Comment implémenter RC basé sur ReadView ? Conception de base : lorsqu'une transaction définit RC, elle régénérera un ReadView à chaque fois qu'elle lancera une requête ! 🎜🎜🎜Il y a une ligne de données dans la base de données, qui est une transaction avec l'identifiant de transaction=50. Elle a été insérée il y a longtemps. La transaction active actuelle est : 🎜🎜🎜🎜🎜Transaction A (id=60) 🎜. 🎜🎜🎜Transaction B (id=70) 🎜🎜🎜🎜🎜Maintenant, la transaction B lance une mise à jour et met à jour ces données en b, donc à ce moment-là, le trx_id des données deviendra l'id=70 de la transaction B, et une annulation log est généré en même temps : 🎜🎜🎜🎜🎜À ce moment, si la transaction A souhaite lancer une opération de requête, elle générera un ReadView🎜🎜🎜🎜À ce moment-là, la transaction A a lancé une requête et a constaté que le trx_id=70 de la donnée actuelle. Autrement dit, entre les plages d'identifiants de transaction appartenant à ReadView, cela signifie qu'il y avait cette transaction active avant qu'elle ne génère ReadView. C'est cette transaction qui a modifié la valeur de ces données, mais la transaction B n'a pas encore été soumise, donc. la liste des transactions actives m_ids de ReadView Ici, il y a deux ID [60, 70]. A ce moment, selon le mécanisme ReadView
, la transaction A ne trouve pas la valeur b modifiée par la transaction B. 🎜🎜 Ensuite, recherchez dans la chaîne de version du journal d'annulation et vous trouverez une valeur originale et constaterez que son trx_id est de 50, ce qui est plus petit que le min_trx_id dans le ReadView actuel. Cela signifie qu'avant de générer le ReadView, une transaction a été insérée. cette valeur et elle a été soumise il y a longtemps, cette valeur originale peut donc être trouvée. 🎜🎜Supposons que la transaction B ait été validée, ce qui signifie qu'il ne s'agit plus d'une transaction active dans la base de données. La prochaine fois que la transaction A interrogera, elle pourra lire la valeur modifiée de la transaction B. Alors, comment la transaction A peut-elle lire la valeur modifiée de la transaction B soumise ? 🎜🎜🎜Laissez la transaction A lancer une requête la prochaine fois et générer un ReadView. La seule transaction active dans la base de données est la transaction A. Par conséquent : 🎜🎜🎜🎜🎜min_trx_id
est 60🎜🎜🎜🎜m_ids
🎜🎜🎜🎜À ce stade time transaction Une requête basée à nouveau sur ce ReadView, et vous constaterez que le trx_id de ces données est 70. Bien qu'il se situe entre la plage min_trx_id et max_trx_id de ReadView, il ne figure pas dans la liste m_ids pour le moment, indiquant que la transaction B a été soumis avant de générer ce ReadView. Lorsque vous effectuez une opération de requête, vous pourrez voir l'opération de mise à jour effectuée par la transaction B, ce qui permettra à la transaction A d'obtenir la valeur B. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!