MySQL-MVCC机制

是什么?

MVCC就是多版本并发控制,实现了【读-写冲突不加锁】,【非阻塞并发读】

MVCC只针对读已提交和可重复读,如果是读未提交,每次都是当前读

**基本思想是:**在每次【更新操作】时,旧版本的数据保存在【undo log日志中】并用【回滚指针】形成一条【版本链】,读数据的时候通过【readview视图】,拿到【版本链】中的旧数据,解决了读-写加锁效率低的问题

对数据库的并发控制:

既然有了MVCC不加锁解决读-写冲突,那么可以用MVCC再搭配乐观锁或者悲观锁去解决写-写冲突,完成对数据库的并发控制

  • MVCC + 悲观锁 MVCC解决读写冲突,悲观锁解决写-写冲突。
  • MVCC + 乐观锁 MVCC解决读写冲突,乐观锁解决写-写冲突。

实现原理:

主要依靠【undo log日志】、【readview视图】和记录中的【三个隐式字段】实现

  • 隐式字段:
    • DB_ROW_ID: B+树要求每个表都有一个主键,如果没有会自动寻找第一个非空的唯一索引作为主键,如果还是没有就自己生成一个自增主键(跟MVCC没什么关系)
    • DB_TRX_ID:记录每次【增删改操作】的事务自增ID,查询不会自增
    • DB_ROLL_PTR: 回滚指针,指向上一个版本记录,形成一条版本链
  • undo log日志:记录每次修改前的数据,保证事务的回滚操作
  • read view视图:维护了【当前未提交事务ID数组】和数组中的【最小id】和【最大id】,用来判断当前记录是否可读
    • 当前记录的事务id<未提交事务的最小id,说明读的记录是已提交的,则可读

    • 当前记录的事务id>未提交事务的最大id,说明则当前读的记录在 这个版本是在生成快照之后产生的,则不可读,要沿着回滚指针比较上一次事务id

    • 最小id<=事务id<=事务的最大id,判断事务id是否在未提交事务id的数组中,若在说明还没提交,则不可读,不在则可读

MySQLMVCC(多版本并发控制)机制保证数据一致性的重要手段。MVCC的核心思想是在数据库中保存多个版本的同一行数据,这些版本在不同的时间被不同的事务读取和修改。因此,每个事务看到的数据版本都是不同的,以此来提高并发性和隔离性。 在MySQL中实现MVCC需要以下两个机制: 1. 版本号:每个数据行都有一个版本号,用来标识该行的版本信息。版本号是一个递增的数字,每次更新数据时都会增加。 2. 快照读:在MVCC中,读取数据时不会对其进行加锁,而是通过快照读的方式来读取数据。快照读会读取最近的数据版本,如果该版本已经被其他事务修改,则会读取最近的未被修改的版本。 当一个事务读取数据时,MySQL会将当前事务的版本号和数据行的版本号进行比较,如果当前事务的版本号小于数据行的版本号,则说明当前事务读取的数据已经被其他事务修改了,此时MySQL会重新读取最新的数据版本。这样可以避免脏读和不可重复读等问题。 当一个事务更新数据时,MySQL会将数据行的版本号加1,并将新版本的数据插入到数据库中。同时,MySQL会将旧版本的数据标记为已经删除,但是并不会真正删除,这样可以保证其他事务仍然可以读取旧版本的数据。 总之,MVCC机制通过版本号和快照读的方式来保证事务的隔离性,避免了脏读、不可重复读和幻读等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值