我正在尝试了解 MVCC,但无法理解。例如。Transaction1 (T1) 尝试读取一些数据行。在同一时间 T2 更新同一行。
交易流程为
T1 开始 -> T2 开始 -> T2 提交 -> T1 提交
因此,第一个事务获取数据库的快照并返回用户结果,他将在该结果上构建其他计算。但据我了解,客户获得旧数据价值?据我了解 MVCC,在 T1 事务开始后,该事务不知道其他一些事务更改数据。因此,如果现在用户在那之后进行一些计算(不涉及数据库),他是在对错误的数据进行计算吗?还是我不对,第一笔交易有一些机制可以知道该行已更改?
现在让我们更改交易流程。
T2beg -> T1beg -> T2com -> T1com
在 2PL 中,用户因为锁而获取更新版本的数据(T1 必须等待排他锁释放)。但在 MVCC 的情况下,它仍然是旧数据,因为我了解 postgresql MVCC 模型。所以我可以用过时的数据来换取速度。我对吗?还是我错过了什么?
谢谢