mysql的mvcc_mysql MVCC

innodb可见性判断

到这里我们也就不难看出实际实现就是这两个数据结构进行比较:

InnoDB每个事务在开始的时候,会将当前系统中的活跃事务列表(trx_sys->trx_list)创建一个副本(read view)在read_vied_sees_trx_id方法里我们有如下比较:

low_limit_id 是“高水位”即当时活跃事务的最大id,如果读到row的db_tx_id>=low_limit_id,说明这些id在此之前的数据都没有提交,如注释中的描述,这些数据都不可见。

if (trx_id >= view->low_limit_id) {

return(FALSE);

}

up_limit_id 是“低水位”即当时活跃事务列表的最小事务id,如果row的db_tx_id

if (trx_id < view->up_limit_id) {

return(TRUE);

}

在两个limit_id之间的我们需要从小到大逐个比较一下:

n_ids = view->n_trx_ids;

for (i = 0; i < n_ids; i++) {

trx_id_t        view_trx_id

= read_view_get_nth_trx_id(view, n_ids – i – 1);

if (trx_id <= view_trx_id) {

return(trx_id != view_trx_id);

}

}

这样我们在要在事务中获取100行数据,我们就能根据这100行的row db_tx_id即本事务的read_view来判断此版本的数据在事务中是否可见。

如果数据不可见我们需要去哪里找上版本的数据呢?就是通过刚才提到过的7BIT的DATA_ROLL_PTR去undo信息中寻找,同时再判断下这个版本的数据是否可见,以此类推。

innodb更新

更新这个大家一般都比较熟悉,我这里简单表述一下,如一个测试表:

create table test (key int primary key,value varchar(10));

insert

InnoDB为每个新增行记录,如insert into test value(’1′,’aaa’), 会创建新的row,row db_tx_id即为当前系统版本号作为创建ID。

update

如update test set value=’bbb’  where key =’bbb’,InnoDB会复制了一行,这个新行的版本号使用了本次db_tx_id更新的版本号。它也把之前版本号作为了删除行的版本,即把原有row delete bit置为删除,不可见。

delete

InnoDB为每个删除行的记录当前系统版本号作为行的删除ID,也就是说把之前说的BIT位置成不可见的。

我这里主要描述的是Innodb主键更新,二级索引的更新大多会映射或转换为多条的主键更新,之前提到 @何_登成 博客 http://hedengcheng.com/?p=148 中举了几个主键更新和二级索引更新的例子,大家可以参看下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值