zoukankan      html  css  js  c++  java
  • 数据无法修改?解密MVCC原理

    问题

    事务隔离级别是可重复读,表结构如下:

    CREATE TABLE `t` (
        `id` int(11) NOT NULL,
        `c` int(11) DEFAULT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB;
    insert into t(id, c) values(1,1),(2,2),(3,3),(4,4);
    

    什么场景会出现下面修改失效的问题?

    场景

    对于下面的两个并发事务,就会出现上面的问题。

    原因

    B更新表t之后,会将表t上所有记录的trx_id修改为B的trx_id,而A在执行update的时候数据已经被B修改了,条件不满足,update失败。然后执行select,这时表t中所有记录的trx_id都是B的,相对于A的ReadView来说,B属于未来事务,所以A看不到,查出来的还是事务开始时的数据。

    这个现象本身不就说明了MVCC解决了可重复读的问题吗?

    ReadView多版本的判断可以参考:ReadView介绍

  • 相关阅读:
    第十章 泛型程序设计与C++标准模板库 迭代器
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
  • 原文地址:https://www.cnblogs.com/jmliao/p/13207058.html
Copyright © 2011-2022 走看看