sql - PostgreSQL 中不同隔离级别的性能后果是什么?
问题描述
我正在编写一个归档脚本(在 Python 中使用 psycopg2),它需要从 PostgreSQL 数据库(9.4)中提取大量数据,处理、上传然后从数据库中删除它。
我开始一个事务,执行一个选择语句来创建一个命名游标,一次从游标中获取 N 行,并处理和上传部分(使用 S3 分段上传)。一旦游标耗尽且未发生错误,我将完成上传并使用与 select 中相同的条件执行删除语句。如果删除成功,我提交事务。
正在主动写入数据库,重要的是要归档和删除相同的行,并且对数据库(包括正在归档的表)的读写继续不间断。也就是说,正在归档的表包含日志,因此永远不会修改现有记录,只会添加新记录。
所以我的问题是:
我应该使用什么级别的隔离来确保归档和删除相同的行?
这些操作会对数据库的读写能力产生什么影响?在我上面描述的过程中是否有任何东西被写或读锁定?
解决方案
你有两个不错的选择:
获取数据
SELECT ... FOR UPDATE
以便行被锁定。然后,当您删除它们时,它们保证在那里。
利用
DELETE FROM ... RETURNING *
然后将返回的行插入到您的存档中。
第二种解决方案更好,因为您只需要一个语句。
没有什么不好的事情发生。如果事务由于某种原因失败,则不会删除任何行。
您可以对这两种解决方案使用默认READ COMMITTED
隔离级别。
推荐阅读
- xamarin - 有没有办法将 Rg.Plugins 与 Xamarin Forms Shell 一起使用?
- postgresql - 使用 Postgres 11 时,UPDATE 中不允许设置返回函数
- android - android - Kotlin - 如何在背景的自定义按钮中访问纯色
- python - 如何打印出缺少数字的列表?
- ios - 没有在带有 Cocoa pod 的设备中运行
- c# - 将专业的名称更改为 aliasName
- javascript - net::ERR_CONNECTION_RESET wampserver 无法在 localhost 上加载 js
- java - Spring security 返回错误,即使我输入了有效数据
- python - 寻找合适的文本
- java - maven系统变量和操作系统依赖