为了账号安全,请及时绑定邮箱和手机立即绑定

一致性问题


老师你好。

你这里关于一致性的定义是"能保证看到系统内的所有更改"

假设我们有两个事务:

事务A是一个读事务:

begin transaction

select * from table1 where id = 1;

commit;

事务B是一个写事务:

begin transaction

update table1 set name=newName where id = 1;

commit;


A事务先开始,B事务后执行。如图中所示,在事务A执行过程中事务B已经commit。

http://img1.sycdn.imooc.com//5a6e959300010b7a08060459.jpg

那么对于事务A而言在mvcc(mysql innodb)机制下能看到事务B更改的数据吗。

正在回答

1 回答

if (在事务A执行过程中事务B已经commit){
    如果你可以确定  那么是一定可以读出来的 

}else if(但是基本是我们不能确定事务A执行过程中事务B是否commit){   

    if(如果mvcc设置的read commit ){

    你说了 A事务先开始,B事务后执行 因为U锁的原因  两个事件是并行的.

    读提交时,读事务每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(不可重复读),但能保证每次都读到最新的数据。

      所以可以读出来  即用log实现视点2(虽然还没Commit)

    }else if(如果mvcc设置的Repeatable read ){

        每次都读取指定的版本,这样保证不会产生不可重复读,但读不到最新的数据

        所以可以读不出来  即视点1

    }

}

当然这一切都是假定在txA和txB同时进行的前提下 

 

    



0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
在线分布式数据库原理与实践
  • 参与学习       42363    人
  • 解答问题       53    个

一起学习事务与分布式事务原理与实践干货,欢迎收藏

进入课程

一致性问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信