栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Postgres pg_try_advisory_lock阻止所有记录

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Postgres pg_try_advisory_lock阻止所有记录

您正在对要扫描的整个集合中的每一行调用pg_try_advisory_lock()(作为在

where
子句中进行的过滤的一部分),而您只希望查询返回的table1中的每一行调用一次。

您可以尝试使用子查询或CTE代替:

with rows as (SELECt a.idFROM table1 aJOIN table2 b ON a.table1_id = b.idWHERe table2.id = 1)select rows.*from rowswhere pg_try_advisory_lock('table1'::regclass::integer, rows.id);

但是也不要依赖于它一定能按预期工作:Postgres应该试图以您的初始查询的方式重写它。

这是另一种可能性,因为

select
语句的一部分在查询中很晚才被求值:

with rows as (SELECT a.id,       pg_try_advisory_lock('table1'::regclass::integer, a.id) as lockedFROM table1 aJOIN table2 b ON a.table1_id = b.idWHERe table2.id = 1)select rows.idfrom rowswhere rows.locked;

实际上,真正的问题

pg_try_advisory_lock()
是您通常会在应用程序领域或函数中找到这些内容,而不是像您正在做的那样在查询中找到这些内容。说到哪个,取决于您在做什么,您确定不应该使用
select… for update
吗?


关于您的更新:

postgres扫描第一行然后停止?

是的。由于存在

limit1
,它将找到一个匹配项并立即停止。但是,可能发生的情况是,
where
根据查询的不同,它没有以相同的顺序评估该子句。SQL不保证首先评估其中的
a <>0
部分
a <> 0 and b / a > c
。应用于您的案例,它不能保证 在a 的行与b联接 之后 获得咨询锁。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634510.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号