在innodb的读未提交的隔离级别下,mvcc的行为?

注意我们现在的隔离级别是读未提交,即最低的隔离级别。这种级别下会出现脏读,A事务修改了一行数据,但在未提交的情况下,这一行数据被A事务以外的行为,简称为F,这个F可能是B事务,也或者是简单的非事务类型的select,给读取了,然后A事务进行了回滚,则F读到的是脏数据。现在看来一切都很通畅。

但是我有一点疑惑,我们知道,innodb下简单的select都是快照读(MVCC提供),那么上面F所做的应该也是快照读,难道当A事务修改完那一行数据之后就立刻进行了快照?否则F怎么会读到A事务对那一行修改完的那个版本呢?应该是F读到A对那一行修改前的版本吧?

多问一句,innodb只要在那一行数据的锁被释放之后就会进行快照?快照是如何被触发的?

阅读 3.9k
4 个回答

你都是读未提交了哪还有什么mvcc
mvcc主要是为了解决幻读问题的
快照的生成就是为了让别人读到的是你修改之前的数据,你都读到未提交了还要什么快照
然后快照是取数据的时候生成的,不管你是要select还是update,都会生成一个快照
修改之后生成快照。。那岂不是整个数据库的数据都要存一个快照。。
你还需要好好理解一下这些概念

泻药,我对这块不是很熟悉,不好意思。

你先好好的理解下事务的4个隔离级别概念,然后在了解下快照概念即可,一般来说,如果你了解透隔离级别的,就知道怎么操作了,不用你想的那么麻烦

上面F所做的应该也是快照读,难道当A事务修改完那一行数据之后就立刻进行了快照?否则F怎么会读到A事务对那一行修改完的那个版本呢?应该是F读到A对那一行修改前的版本吧?

F读到的数据是A事务开始前的快照,A事务在未完成前的更新操作,对其他connection的F是不可见的,如果F也更新,需要等待A事务结束

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题