PostgreSQL中不同隔离级别对性能有何影响?

时间:2019-02-22 16:54:16

标签: sql postgresql transactions archiving

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

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

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

所以我的问题是:

我应该使用哪种隔离级别来确保将相同的行存档和删除?

这些操作将对数据库的读写能力产生什么影响?在上面描述的过程中,任何东西都不会被写入或读取锁定吗?

1 个答案:

答案 0 :(得分:2)

您有两个不错的选择:

  1. 获取数据

    SELECT ... FOR UPDATE
    

    ,以便锁定行。然后,当您删除它们时,一定会在那里。

  2. 使用

    DELETE FROM ... RETURNING *
    

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

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

没有坏事发生。如果交易由于任何原因失败,则不会删除任何行。

两种解决方案都可以使用默认的READ COMMITTED隔离级别。