首页 > 解决方案 > PostgreSQL 中不同隔离级别的性能后果是什么?

问题描述

我正在编写一个归档脚本(在 Python 中使用 psycopg2),它需要从 PostgreSQL 数据库(9.4)中提取大量数据,处理、上传然后从数据库中删除它。

我开始一个事务,执行一个选择语句来创建一个命名游标,一次从游标中获取 N 行,并处理和上传部分(使用 S3 分段上传)。一旦游标耗尽且未发生错误,我将完成上传并使用与 select 中相同的条件执行删除语句。如果删除成功,我提交事务。

正在主动写入数据库,重要的是要归档和删除相同的行,并且对数据库(包括正在归档的表)的读写继续不间断。也就是说,正在归档的表包含日志,因此永远不会修改现有记录,只会添加新记录。

所以我的问题是:

我应该使用什么级别的隔离来确保归档和删除相同的行?

这些操作会对数据库的读写能力产生什么影响?在我上面描述的过程中是否有任何东西被写或读锁定?

标签: sqlpostgresqltransactionsarchiving

解决方案


你有两个不错的选择:

  1. 获取数据

    SELECT ... FOR UPDATE
    

    以便行被锁定。然后,当您删除它们时,它们保证在那里。

  2. 利用

    DELETE FROM ... RETURNING *
    

    然后将返回的行插入到您的存档中。

第二种解决方案更好,因为您只需要一个语句。

没有什么不好的事情发生。如果事务由于某种原因失败,则不会删除任何行。

您可以对这两种解决方案使用默认READ COMMITTED隔离级别。


推荐阅读