MVCC原理

    MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

        从一个例子开始,两个客户端(c1,c2同时对一个表进行操作)同时连接数据库,同时关闭自动提交(set autocommit = 0)。

        例1:同时开启事务(begin)->c1不做操作->c2更新表数据->c2提交(commit)->c1查询(结果为c2更新后数据)。

        例2:同时开启事务(begin)->c1查询->c2更新表数据->c2提交(commit)->c1查询(结果为c2更新前数据)。

        当前读:每次读取都读取最新的数据,触发当前读的操作update、delete、insert、select ... for update、select ... lock in share mode。

        快照读:当事务开启后,每次进行select都会触发快照读。

        首先了解下mysql的隐藏字段,DB_TRX_ID(当前事务id),DB_ROW_PTR(指向上一次事务记录的指针其实是上一条undolog的记录),DB_ROW_ID(随机唯一id)。其他为正常数据记录。

        undolog属于是一个链表,链表的连接就是通过DB_ROLL_PTR指针进行连接,会记录每一次进行当前读操作的旧记录,便于回滚。

        事务在进行快照读的时候产生readview简称读视图,其中共有三个主要字段TRX_LIST(当前活跃事务ID)、UP_LIMIT_ID(列表中最小的事务ID)、LOW_LIMIT_ID(系统尚未分配的下一个事务ID)

        通过可见性算法即可推导出当前快照读的结果。

        1、首先比较DB_TRX_ID < UP_LIMIT_ID,如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于走下一个判断。

        2、接下来判断DB_TRX_ID >= LOW_LIMIT_ID,如果大于等于则代表DB_TRX_ID所在的记录在read view生成后才出现,那么对于当前事务肯定不可见,如果小于,则进入下一个判断。

        3、判断DB_TRX_ID是否在活跃事务中,如果在,则代表在read view生成时刻,这个事务还是活跃状态,还没有commit;,修改的数据,当前事务也是看不到,如果不在,则说明这个事务在read view生成之前就已经开始commit,那么修改的结果是能够看见的。

写不出来咋能说出来?以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种数据库并发控制机制,主要用于保证在高并发环境下数据的一致性和完整性。在Java中,MVCC通常与关系型数据库系统如Oracle、MySQL等的InnoDB存储引擎相关。 MVCC原理主要包含以下几个关键点: 1. 数据版本:每个事务看到的是数据的一个独立版本,而不是实时的最新状态。每个版本都有一个时间戳或版本号,表示该数据的修改时间。 2. 读已提交(Read Committed):当事务开始时,它只会看到已经提交的更改。这样,即使有其他事务在修改同一数据,当前事务也能看到稳定的结果,不会看到未提交的更改。 3. 少数读脏(Read Uncommitted):一些数据库支持更高的并发度,允许事务看到其他事务未提交的修改,但这可能导致“脏读”(读到未提交的数据)。这是有风险的,通常仅在特定场景下使用。 4. 不可重复读(Repeatable Read):事务在执行过程中,如果多次读取同一数据,结果应该一致,不会因为其他事务的提交而改变,这通常通过锁定机制来实现。 5. 可串行化(Serializable):这是最高的隔离级别,确保所有事务看起来像是顺序执行,但实际性能较低。 在Java中,MVCC不直接体现在语言层面,而是由底层数据库管理系统实现。例如,Java应用程序通过JDBC连接数据库时,其实质上是在和数据库进行MVCC相关的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yulin6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值