湖北企业网站建设,网站开发制作步骤图,如何做app软件开发,网站建设管理分工的说明MVCC浅析 事务 提到事务#xff0c;我们就会想到#xff1a;ACID#xff08;原子性#xff0c;一致性#xff0c;隔离性#xff0c;持久性#xff09;#xff0c;今天我们谈谈其中的——隔离性 隔离级别 数据库上有多个事务执行的时候#xff0c;会引发#xff1a;脏…MVCC浅析事务提到事务我们就会想到ACID原子性一致性隔离性持久性今天我们谈谈其中的——隔离性隔离级别数据库上有多个事务执行的时候会引发脏读、可重复度、幻读。相应的为了解决这些问题数据库有隔离级别一说读未提交、读已提交、可重复读、串行化效率依次下降读未提交A、B两个事务A事务修改了B事务能够立刻看到读已提交一个事务提交之后它所做的操作才能让其它事务看到可重复度一个事务执行中看到的数据总是和这个事务启动的时候看到的数据是一致的串行化事务串行化执行也就是读加读锁写加写锁读写冲突的时候顺序执行如何实现隔离性我们看一个示例环境事务的隔离级别我们创建一张表CREATETABLEtransaction_test(idINT(11)NOTNULL,vINT(11)DEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDB;# 插入数据insertintotransaction_test(id,v)values(1,1),(2,2);设置为自动提交场景事务A事务B事务Cstart transaction with consistent snapshot–––start transaction with consistent snapshot–––update transaction_test set v v 1 where id 1;–––update transaction_test set v v 1 where id 1;select v from transaction_test where id 1;–––select v from transaction_test where id 1;commit;–––commit;start transaction with consistent snapshot 表示的是执行当前语句的时候直接启动一个事务。而begin/start transaction 则是在执行第一个语句的时候才会开启一个事务两个select的结果是什么呢事务A查询到的结果是v1而事务B查询到的结果是v3是不是还是蛮神奇的那么为什么会出现这种现象呢我们带着疑问开启今天的MVCC解析MVCCMVCC全称 Multi-Version Concurrency Control即多版本并发控制。目的是为了在多线程环境下数据库也能拥有很高的性能即使是并发的读写也能做到无锁处理多版本指的是数据有多个版本而不是数据库存在多个版本多版本当你开启一个事务时在执行DML非读操作语句时事务会向系统申请一个事务ID——transaction_id你做一次更新数据库会将修改后的值以及修改者信息记录并将该信息作为当前版本数据追加到修改前数据之后。实际上对于SELECT … FOR UPDATE也会触发这个申请事务ID的动作一致性视图一致性视图和数据库中创建的view不一样那个是能真实的查询的类似于表那样的使用。而一致性视图只是为了支持RRRC隔离级别的实现。在RR级别下InnoDB会为每一个事务生成四个值当前活跃的事务ID、当前事务ID、活跃的事务ID最小值和当前系统已经创建过的事务ID1大致能构建出这么个数组然后当你使用select 快照查询的时候就能根据这个数组来找到当前事务所能看到的数据。这个是前面的示例我们假设事务A的事务ID是98事务B的是99事务C的是100那么事务A在查询的时候只能看到已经提交的事务97因为它自己的四个值为活跃性事务数组[98]活跃事务数组最小值98当前系统创建过的事务ID198自己的事务ID98。它看到了数据的三个版本v3的因为事务ID是99处于未知的事务所以不可见v2的事务ID为100处于未知事务所以也是不可见v1的事务ID为97小于活跃事务数组最小值可见所以查询出来的值为v1。事务B的查询也是类似不同点在于它是在自己更新之后查询的数据自然是可见最新值关于可见性假设数据版本对应的事务ID为v_tx_id活跃事务数组为tx_ids活跃事务数组最小值为min_tx_id当前系统创建过的事务ID1为max_tx_id当前事务ID为cur_tx_id则有v_tx_id小于min_tx_id则可见v_tx_id介于min_tx_id和max_tx_id之间如果在tx_ids中且不是cur_tx_id则不可见如果在tx_ids中且是cur_tx_id则可见如果不在tx_ids中则可见v_tx_id大于max_tx_id则不可见实际上就是版本未提交不可见版本已提交但是在视图创建之后则不可见版本已提交但是在视图创建之前则可见自己更新的可见RR状态下就是事务用一个视图RC状态下就是查询语句的时候会单开一个视图。总结MVCC是为了解决在并发条件下也能无锁的更新数据保持高性能。而一致性视图能实现了RR和RC的数据库隔离级别疑惑在一致性视图中为什么活跃事务数组最小值是数组的最小值而最大值则是系统的已创建的事务ID1因为事务ID的申请和一致性视图的开启之间可能会有其它事务的创建甚至其它事务是已经提交的状态那么按照前面的判断大于最大值的情况下直接就是不可见但是其实在这个事务开启一致性视图的时候比当前事务ID大的已经创建出来并且提交了那么如果你还是活跃性事务数组的最大值那么这个已经提交的事务修改的数据对你来说是不可见的这个应该不算问题更多的是注意事项吧。开启事务的语句差别直接begin/start transaction是不会立即开启一致性视图的而是会等到第一个select语句才会开启一致性视图而申请事务ID则是会等到update等这些DML语句还有select for update也是能触发这一篇更多的是笔记作为文章的话不足之处有很多。如有问题不论是什么问题烦请指出不胜感激参考https://time.geekbang.org/column/article/70562