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

建议性锁定还是NOWAIT以避免等待锁定的行?

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

建议性锁定还是NOWAIT以避免等待锁定的行?

FOR UPDATE NOWAIT
如果您坚持锁定特定的行,这 不是 一个好主意,那 不是
您所需要的。您只需要 任何 符合条件的可用(解锁)行。重要的区别是此(引用Postgres
9.4手册
):

使用

NOWAIT
,如果无法立即锁定选定的行,该语句将报告错误,而不是等待。

相同的查询很可能会尝试锁定相同的任意选择。

FOR UPDATE NOWAIT
只会因出现异常而纾困(除非捕获错误,否则它将回滚整个事务),您必须重试。

我在dba.SE上引用的答案中的解决方案结合使用了plain

FOR UPDATE
和以下内容
pg_try_advisory_lock()

pg_try_advisory_lock
与相似
pg_advisory_lock
,不同之处在于该功能将不等待锁变为可用。它将立即获取锁并返回true,或者如果无法立即获取锁,则返回false。

因此, 最好的选择 是……第三种选择:

FOR UPDATE SKIP LOCKED
Postgres
9.5中的新功能,它实现了相同的行为,而没有额外的函数调用。

Postgres 9.5的手册比较了这两个选项,并进一步说明了不同之处:

为防止操作等待其他事务提交,请使用

NOWAIT
SKIPLOCKED
选项。使用
NOWAIT
,如果无法立即锁定选定的行,该语句将报告错误,而不是等待。使用
SKIPLOCKED
,将跳过所有不能立即锁定的选定行。

在Postgres 9.4或更早的版本上,您的 下一个最佳选择

pg_try_advisory_xact_lock(id)
FORUPDATE
参考答案中所示的类似物组合使用:

  • Postgres UPDATE-LIMIT 1

(还带有的实现

FOR UPDATE SKIP LOCKED
。)

在旁边

严格来说,您会得到任意选择,而不是真正的随机选择。



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

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

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