Postgresql 试着理解MVCC

Postgresql 试着理解MVCC,postgresql,mvcc,Postgresql,Mvcc,我试图理解MVCC,但却无法理解。例如 事务1(T1)尝试读取某些数据行。在同一时间,T2更新同一行 交易流程是 T1开始->T2开始->T2提交->T1提交 因此,第一个事务获取数据库的快照,并返回给用户结果,用户将根据该结果进行其他计算。但据我所知,客户是否获得了旧的数据价值?据我所知,在T1事务开始后,该事务不知道其他事务会更改数据。所以,若现在用户在那个之后做一些计算(不涉及数据库),他是在错误的数据上做的吗?或者我不对,第一个事务有一些机制知道行被更改了 现在让我们更改事务流 T2be

我试图理解MVCC,但却无法理解。例如 事务1(T1)尝试读取某些数据行。在同一时间,T2更新同一行

交易流程是

T1开始->T2开始->T2提交->T1提交

因此,第一个事务获取数据库的快照,并返回给用户结果,用户将根据该结果进行其他计算。但据我所知,客户是否获得了旧的数据价值?据我所知,在T1事务开始后,该事务不知道其他事务会更改数据。所以,若现在用户在那个之后做一些计算(不涉及数据库),他是在错误的数据上做的吗?或者我不对,第一个事务有一些机制知道行被更改了

现在让我们更改事务流

T2beg->T1beg->T2com->T1com

在2PL中,由于锁(T1必须等待独占锁释放)的原因,用户获取更新版本的数据。但就MVCC而言,它仍然是旧数据,正如我所理解的postgresql MVCC模型。所以我可以用陈旧的数据来换取速度。我说得对吗?还是我错过了什么

多谢各位

事务的流程是next T1 begin->T2 begin->T2 commit->T1 commit。因此,第一个事务获取数据库的快照,并返回给用户结果,用户将根据该结果进行其他计算。但据我所知,客户是否获得了旧的数据价值

除非T1和T2尝试更新同一行,否则通常可以将其重新排序为:T1开始;T1提交;T2开始;T2提交


换句话说,在T1做出决策时,T2更改数据可能会产生任何不良的业务结果,也可能在T1做出相同决策后,T2立即更改数据。是的,您可能会从数据库中读取一些旧数据(并发事务已修改),基于此执行计算,并将“过时”数据存储在数据库中

这不是问题,因为与事务发生的实际顺序不同,逻辑顺序更相关:

如果T1读取一些数据,然后T2修改数据,然后T1根据它读取的数据修改数据库,可以说T1逻辑上发生在T2之前,并且没有不一致性

只有T1和T2修改相同的数据时才会出现异常:T1读取数据,T2修改数据,然后T1根据读取的内容修改相同的数据。这种异常称为“丢失更新”

丢失的更新只能在最弱(默认)的隔离级别下发生,
readcommitted


如果希望更好地隔离并发活动,则需要至少使用
可重复读取
隔离。然后T1在尝试更新数据时会收到序列化错误,您必须重复该事务。第二次尝试时,它将读取新数据,并且所有内容都将保持一致。

谢谢。还有一个小问题。我能在什么地方读一下隔离级别在内部是如何共同工作的吗?一些概念?那将是SQL标准。要花几百美元,而且几乎看不懂。如果您想知道它是如何在PostgreSQL中实现的,您必须阅读(有详细文档记录的)源代码。一个起点可能是。