并行访问行:锁定行"隐藏"

时间:2017-02-13 14:28:38

标签: postgresql transactions locking

TL; DR 即可。我希望锁定行对后续查询不可见,直到释放锁定为止。

我正在处理依赖于对数据的并发访问的应用程序。

我有需要处理的数据,以及需要在同一组数据上运行的数千个SQL查询。在应用程序级别,我将所有SQL查询序列化为一个大队列,并在事务中逐个执行。

然而,我想删除这个人为的排队"我在应用程序级别上做的瓶颈,完全依赖于DB的内置并发原语& amp;基于光标的数据访问。

为此,我需要确保两个并发的SQL查询永远不会获取相同的行集,例如以前的查询锁定行和以后的查询忽略锁定的行。

我希望以下图片能够正常工作(示例已按意图简化;请考虑使用基于游标的访问在事务中运行每个SELECT

SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 1, 2, 3, 4, 5
SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 6, 7, 8, 9, 10

我的问题是:这甚至可以做到吗?或者我是否要求DB过多?

1 个答案:

答案 0 :(得分:2)

使用PostgreSQL 9.5或更高版本,您可以在事务中执行此操作:

SELECT * FROM my_table
ORDER BY id
LIMIT 5
FOR UPDATE SKIP LOCKED;