MySQL之MVCC与幻读

MVCC(多版本并发控制)是MySQL中用于提升事务并发处理能力的技术,通过保存数据快照实现读写不阻塞。在InnoDB存储引擎中,MVCC通过隐藏字段、事务号和undo log实现。幻读是可重复读隔离级别下的一种现象,MySQL通过Next-Key锁或设置事务为SERIALIZABLE来解决幻读问题。
摘要由CSDN通过智能技术生成

MVCC

1. 什么是MVCC?

多版本并发控制技术的英文全称是 Multiversion Concurrency Control,简称 MVCC 。

是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。MVCC将数据库的行锁行的多个版本结合起来,只需要很小的开销就可以实现读写不加锁,从而大大提高数据库系统的并发性能。

注意

  1. 写写情况还是需要加锁阻塞的。

  2. MVCC并没有解决幻读问题。

2. MVCC解决什么问题?

  1. 通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。
  2. 因为 InnoDB 的 MVCC 采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。
  3. 一致性读也被称为快照读,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。

3. MVCC如何工作?

MVCC保存某个时间点上的数据快照。一个事务内,看到的是同一个版本的快照,数据一致。不同事务在同一时间点看到的数据会不一致,因为他们得到的数据版本不一样。不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。

隐藏字段

在InnoDB中,每个数据行记录除了一般数据列还包含下面几个隐藏字段:

  • DB_ROW_ID :6-byte,隐藏的行 ID,用来生成默认聚簇索引。如果我们创建数据表的时候没有指定聚簇索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。

  • DB_TRX_ID :6-byte,操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。这也是下面所说的修改版本号删除版本号

    注意有1 bit用来标志是否被删除。

  • DB_ROLL_PTR :7-byte,回滚指针,也就是指向这个记

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值