我正在编写一个归档脚本(在Python中使用psycopg2),该脚本需要从PostgreSQL数据库(9.4)中提取大量数据,进行处理,上载然后从数据库中删除。
我开始交易,执行select语句创建一个命名的游标,一次从游标中获取N行,并进行零件的处理和上传(使用S3分段上传)。一旦游标耗尽,并且没有发生错误,我将使用与select中相同的条件来完成上载并执行delete语句。如果删除成功,则提交事务。
正在积极地写入数据库,重要的是要对相同的行进行归档和删除,并且对数据库(包括正在归档的表)的读取和写入应不间断地继续进行。也就是说,要归档的表包含日志,因此永远不会修改现有记录,而只会添加新记录。
所以我的问题是:
我应该使用哪种隔离级别来确保将相同的行存档和删除?
这些操作将对数据库的读写能力产生什么影响?在上面描述的过程中,任何东西都不会被写入或读取锁定吗?
答案 0 :(得分:2)
您有两个不错的选择:
获取数据
SELECT ... FOR UPDATE
,以便锁定行。然后,当您删除它们时,一定会在那里。
使用
DELETE FROM ... RETURNING *
然后将返回的行插入到存档中。
第二种解决方案更好,因为您只需要一个语句即可。
没有坏事发生。如果交易由于任何原因失败,则不会删除任何行。
两种解决方案都可以使用默认的READ COMMITTED
隔离级别。