PostgreSQL + Rails并发澄清

时间:2012-02-06 21:59:23

标签: ruby-on-rails postgresql concurrentmodification

我正在构建一个后台作业,用于更新Web应用程序的用户统计信息。这项工作目前需要55-60秒,我担心如果用户在作业运行的同时尝试加载他的统计页面会发生什么。

从我读到的有关PostgreSQL和并发的内容来看,如果两个客户端尝试访问同一行(一次更新和一次读取),并且我没有明确启动任何事务,那么第一个只需要等待第二个完成。

因此,如果我理解正确的话,我可能会遇到的唯一性能损失是用户在更新行的同一时刻尝试加载其统计信息页面的极小的可能性。这并不像整个统计表在55-60秒的工作期间被锁定,除非我明确配置Postgres来做到这一点,对吗?

这是正确的解释吗?我还缺少其他因素吗?

(我提到了Rails部分,以防它与上述情况有任何关系)

(另外:PostgreSQL版本是9.0.4)

1 个答案:

答案 0 :(得分:2)

这取决于事务隔离级别。如果我有你的情况 - 你说的是Dirty Read避免延迟。是的,如果使用默认隔离级别,则无法进行脏读。只有在尝试获取正在更新的同一行时,Reader才会等待编写器。

  

Read Committed是PostgreSQL中的默认隔离级别。当事务在此隔离级别上运行时,SELECT查询仅查看在查询开始之前提交的数据;

specs on ISOLATION