Mysql事务分析(2)

·  阅读 253

在上一篇中我们说到了undo-log版本链条,接下来我们分析一下ReadView机制是怎么基于undo-log链条实现的。

ReadView机制

对于readView而言就是让你开启事务的时候就会生成一个readView里面包含4个东西。

  1. m_ids 此时正在执行的未提交的事务id
  2. min_trx_id 就是m_id中最小的事务id
  3. max_trx_id 就是m_id中最大的事务id,也就是下次事务的id
  4. creator_trx_id 当前事务id

现在我们举例说明一下这个readview怎么使用。假设现在我们有一条数据很早以前被事务插入进来了。如图:

接着现在有事务A 和事务B , 其中事务A(id=45)需要读取这个数据的值,而事务B(id=50)需要修改数据的值。

  1. 事务A先查询这个数据时会生成ReadView m_ids(45、50)min_trx_id=45 、max_trx_id=51 、creator_trx_id=45 那它查询的时候发现当前这个数据的事务id=1 比自己的min_trx_id小说明这个数据很早以前就存在,可以查询到这个数据。

2. 事务B执行了它开始修改数据吧原始值改为了值B,并用自己roll_pointer指向了上一个undolog接着事务B就提交了。 3. 这个时候事务A再次查询发现当前数据的当前事务id=50 但是小于了自己的max_trx_id,说明它是和自己差不多开启的事务去修改的。所以不能查询顺着roll_pointer 找到了原始值。所以查询的时候还是查询原始值。这就是undolog链条的作用可以顺着查询下一个快照的值。避免了不可重复读的问题。 4. 接着事务A修改了数据将值B修改为了值A。同时保存了事务B修改的快照。如下图所示

那么事务A再查询的时候发现当前数据的事务id=45 和自己的creator_trx_id一样那么当然可以查询到自己修改的数据值。

5.接着事务C开启了它的事务id是75 并修改了数据为值C 然后迅速提交了。 6.事务A再来查询的时候发现当前数据的事务id是75 大于了自己的max_trx_id 是事务A开启之后开启的事务C 那不能查询我们顺着查询下一个发现事务id=45 和自己的一样当然查询自己的数据。所以还是展示位值A. 最后通过这个readView机制就可以在并发执行的时候实现数据隔离。

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改