mysql的隔离级别有读未提交、读已提交、可重复读和顺序读。
MVCC生效的隔离级别是读已提交和可重复读。可重复读解决的是对同一记录的两次读取不一致的问题。
那么,为什么 MVCC+读已提交 还会造成两次读取不一致?在事务2中更新那条记录后提交,那条记录的事务版本不是会增大,然后事物1读取的那条记录不应该是未更新之前的吗,即读取的是那条记录的老的版本,这不是一致的吗?我没有理解,求解答
“然后事物1读取的那条记录不应该是未更新之前的吗”。事务1应该读事务2更新后的值吧,因为隔离级别是:read-committed
虽然隔离级别是read-committed,mvcc机制是“只读取当前事物id之前的数据快照”,所以事物2执行更新操作并提交后,更新后的数据的快照id会增大,所以事物1读到的还是未更新时的值。
@kongieg: “只读取当前事物id之前的数据快照”这结论是哪里来的,可以发个链接看看吧,我不太熟悉mvcc,不过我觉得可能不是这样。有没有可能一个事务里第一次读取数据时是从一个最新的快照里读的,第二次读取时是从一个更加新的快照里读的。
@kongieg: 我找了些文章看,和你说的不一样呢:https://blog.csdn.net/baihang111/article/details/123402681 。看此哥们儿的博客,事务读取的是最新的还是只从事务开始那个镜像读是取决于隔离级别的。如果隔离级别是read committed,总是读最新的undo log
@会长:确实应该是这篇博客里的这样,我是看了MYSQL的书关于mvcc的介绍,所以不是很清楚一知半解的