【问题标题】:Can concurrent value modification impact single select in PostgreSQL 9.1?并发值修改会影响 PostgreSQL 9.1 中的单选吗?
【发布时间】:2012-08-20 01:37:53
【问题描述】:

考虑在 PostgreSQL 9.1(或 9.2)中执行的以下查询:

SELECT * FROM foo WHERE bar = true

假设这是一个运行时间相当长的查询(例如,需要一分钟)。

如果在查询开始时bar = true 持有 500 万条记录,并且在此查询期间在另一个事务中在 foo 表中添加和删除了行,并且对某些现有行进行了更新到bar 字段。

这是否会影响上述选择查询的结果?

我知道单个事务中不同语句之间的事务隔离和可见性,但是正在运行的单个语句呢?

【问题讨论】:

    标签: sql postgresql transaction-isolation


    【解决方案1】:

    没有。
    由于 MVCC 模型,只有在 query 开始时可见的元组将在单个 SELECT 中使用。手册中有详细说明here

    Read Committed 是 PostgreSQL 中的默认隔离级别。当一个 事务使用这个隔离级别,一个 SELECT 查询(没有 FOR UPDATE/SHARE 子句)只看到查询开始前提交的数据; 它永远不会看到未提交的数据或在期间提交的更改 通过并发事务执行查询。实际上,一个 SELECT 查询 在查询开始的那一刻看到数据库的快照 跑步。但是, SELECT 确实看到了以前执行的更新的效果 在它自己的事务中,即使它们尚未提交。 另请注意,两个连续的 SELECT 命令可以看到不同的数据, 即使它们在单个事务中,如果其他 事务在执行第一个 SELECT 期间提交更改。

    强调我的。

    【讨论】:

      【解决方案2】:

      查询将是查询开始时数据的读取一致视图。在 Postgresql 中,关于多版本并发控制 (MVCC) 的文档解释了它是如何完成的(表中存在多个版本的记录)。在 Oracle 中,序列更改号 (SCN) 与修改数据的“前映像”一起使用。这是一个旧文档Transaction Processing in Postgresql,其中包含“非覆盖存储管理”部分。但是看看 MVCC。

      或者阅读 Postgresql 文档中关于 MVCC 的章节

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        • 2020-12-22
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多