中国联通 网站备案,东莞长安网站推广公司,网页设计师职业规划,竞价单页制作一、MVCC简介
MVCC是一种用来解决读写冲读的无锁并发控制#xff0c;也就是为事务分配单增长的时间戳#xff0c;为每个修改保存一个版本#xff0c;版本与事务时间戳关联#xff0c;读操作只读该事务开始前的数据库的快照#xff0c;所以MVCC可以为数据库解决一些问题。…一、MVCC简介
MVCC是一种用来解决读写冲读的无锁并发控制也就是为事务分配单增长的时间戳为每个修改保存一个版本版本与事务时间戳关联读操作只读该事务开始前的数据库的快照所以MVCC可以为数据库解决一些问题。
二、数据并发场景
读读不存在任何问题也不需要并发控制。读写有线程安全问题kennel会造成事务隔离性问题可能遇到脏读、幻读、不可重复读。写写有线程安全问题可能存在更新丢失问题。mysql-分析并解决mvcc更新丢失问题
三、MySQL事务隔离级别 四、MVCC能解决的问题
在并发读写数据库是 可以做到在读操作时不用阻塞写操作在写操作时不用阻塞读操作提高数据库并发读写性能。快照读不触发间隙锁。解决脏读、幻读、不可重复读等事务隔离问题但不能解决更新丢失问题。
五、 当前读和快照读的区别
当前读 它读取的数据记录都是当前最新的版本会对当前读区的数据进行加锁防止其他事务修改数据是被关锁的一种操作。 如下操作都是当前读
select lock in share mode(共享锁) 行锁级别select for update(排他锁) 行锁级别update(排他锁)insert排他锁delete排他锁串行化事务隔离级别排他锁
快照读
快照读实现基于多版本并发控制即MVCC既然是多版本那么快照读读到的数据不一定是当前最新的数据有可能是之前历史版本的数据。 如下操作是快照读
不加锁的select操作注事务级别不是串行化 读已提交和重复读他们的快照都是基于MVCC实现的MVCC常见的概念undolog、版本链、readview。
版本链 readview: 作用让你知道在版本链里选择哪些记录。 涉及的字段 m_ids:表示生成readview时当前系统中活跃(未提交)的时读写事务的id。 min_trx_id:表示生成readview时当前系统中活跃的读写事务中最小的事务id。 max_trx_id:表示生成readview时系统应该分配给下一个事务的id。 creator_trx_id:表示生成该readview的事务id。 readview如何判断版本链中的哪些版本可用
trx_idcreator_trx_id:可以访问这个版本。trx_id min_trx_id:可以访问这个版本。trx_id max_trx_id:不可以访问这个版本。min_trx_id trx_id max_trx_id: 如果trx_id在m_ids中时不可以访问这个版本的反之可以。
六、读已提交和可重复读生成review的时机
读已提交和可重复读生成的时机不同。 读已提交事务每次执行select查询的时候都会生成一个新的readview他是以每个select执行语句为单位的。比如开启事务在事务中执行两次select查询这两个查询会生成两个readview每个select查询对应一个readview,也是没有实现可重复读的一个原因。 可重复读生成readview是以一个事务为单位同一个事务中执行多次select只会生成一个readview。可重复读无法解决删除幻读但可以解决插入幻读若想解决删除幻读可以开启间隙锁。mysql-分析并解决可重复读隔离级别发生的删除幻读问题
七、幻读在不同书中的不同定义
在《数据库系统概念》第五版-王珊、萨师煊著这样定义的
事务T1按一定条件从数据库中读取了某些数据记录后事务T2删除了其中部分记录当T1再次按相同条件读区数据时发现某些记录神秘消失了。事务T1按一定条件从数据库中读取了某些数据记录后事务T2插入了一些记录当T1再次按相同条件读区数据时发现多了一些记录。
这两种不可重复读有时也被称为幻影现象幻读。
在《mysql王者晋升之路》-张甦著这样定义的
不可重复读是指在其中一个事务中读取到了其他事务针对旧数据的修改记录常见的操作就是update或者delete语句。这里也可以说明作者是将删除归于不可重复读而不是幻读。幻读是指在其中一个事务中读取到了其他事务新增的数据仿佛出现了幻影现象常见操作就是Insert语句这种读的现象允许出现在读已提交的事务隔离级别中。
这两本书对幻读的定义有歧义第一本书是将删除和插入都归于幻读第二本书之将插入归于幻读。本文章是基于第一本书。