锦州网站建设市场,WordPress朗读,seo行业岗位有哪些,安徽六安市地图位置是什么#xff1a;MVCC指的是在读已提交、可重复读这两种隔离级别下的事务在执行普通的select操作时#xff0c;访问记录的版本链的过程#xff0c;可以使不同事务的读写操作并发执行#xff0c;提高性能。
MVCC 隐藏字段 undo log 版本链 ReadView 1.隐藏字段#xf…是什么MVCC指的是在读已提交、可重复读这两种隔离级别下的事务在执行普通的select操作时访问记录的版本链的过程可以使不同事务的读写操作并发执行提高性能。
MVCC 隐藏字段 undo log 版本链 ReadView 1.隐藏字段对于聚簇索引来说每条记录都有trx_id和roll_pointer两个隐藏列。 trx_id修改该记录的事务的id roll_pointer: 每次记录修改的时候旧的版本会记录在undolog中roll_pointer指向该记录旧的版本。
2.undo log 版本链 一个记录的历史版本在undolog中使用roll_pointer串成一个链
3.ReadView undolog中有一条记录的多个版本ReadView解决的问题是读的时候应该读取哪个版本的问题 ReadView包含4个比较重要的字段 1)creator_trx_id 创建这个 Read View 的事务 ID。select不会产生事务id只有updateinsertdelete才会产生。 2)m_ids 表示在生成ReadView时当前系统中活跃的读写事务的 事务id列表 3)min_trx_id: 活跃的事务id中的最小值。 4)max_trx_id分配给下一个事务的id值
review判断记录的某个版本是否可见的规则 1)如果被访问版本的trx_id属性值与ReadView中的 creator_trx_id 值相同意味着当前事务在访问它自己修改过的记录所以该版本可以被当前事务访问。 (trx_id creator_trx_id, 同一个事务可以访问当前记录的版本) 2)如果被访问版本的trx_id属性值小于ReadView中的 min_trx_id 值表明生成该版本的事务在当前事务生成ReadView前已经提交所以该版本可以被当前事务访问。 (trx_id min_trx_id当前记录的事务id比活跃的事务的最小id还小说明当前记录的事务已经提交可以访问当前记录的版本) 3)如果被访问版本的trx_id属性值大于或等于ReadView中的 max_trx_id 值表明生成该版本的事务在当前事务生成ReadView后才开启所以该版本不可以被当前事务访问。 (trx_id max_trx_id当前记录的事务在当前事务生成readview之后才开启不可以访问当前记录的版本) 4)如果被访问版本的trx_id属性值在ReadView的 min_trx_id 和 max_trx_id 之间那就需要判断一下trx_id属性值是不是在 m_ids 列表中。min_trx_id trx_id max_trx_id
如果在说明创建ReadView时生成该版本的事务还是活跃的该版本不可以被访问。如果不在说明创建ReadView时生成该版本的事务已经被提交该版本可以被访问。
读已提交和可重复读隔离级别下mvcc的区别 读已提交在每次查询开始时都会重新生成一个readview。由于每次查询都会生成新的readview即使有其它的事务修改了某个数据然后提交了那么重新查询的时候也能看见修改这就实现了读已提交当然再次查询的时候数据变了这就是不可重复读 可重复读只会在第一次查询时生成一个readview之后的查询不会重新生成。由于只会在第一次查询的时候生成readview即使有其它的事务修改了某个数据然后提交了那么重新查询的时候还是原来的readview根据readview规则判断提交的数据对新的查询还是不可见的所以实现了不可重复读
可重复读存在幻读的问题。
快照读不加锁简单的select是快照读。使用mvcc实现。可能读到最新的数据也有可能读到历史数据。 当前读加锁实现select或者增删改的时候加锁都属于当前读。只能读到最新的数据。 当前读例子
SELECT * FROM student LOCK IN SHARE MODE; # 共享锁
SELECT * FROM student FOR UPDATE; # 排他锁
INSERT INTO student values ... # 排他锁
DELETE FROM student WHERE ... # 排他锁
UPDATE student SET ... # 排他锁