【问题标题】:postgres SKIP LOCKED not workingpostgres SKIP LOCKED 不起作用
【发布时间】:2018-07-10 10:28:09
【问题描述】:

按照我测试SKIP LOCKED的步骤:

  1. 打开一些 Postgres UI 客户端的 sql 控制台
  2. 连接到 Postgres 数据库
  3. 执行查询

    CREATE TABLE t_demo AS
    SELECT         *
    FROM            generate_series(1, 4) AS id;
    

在该表中创建检查行:

TABLE t_demo

使用以下查询选择行:

 SELECT * 
 FROM t_demo 
 WHERE id = 2 
 FOR UPDATE SKIP LOCKED;

返回结果为 2

现在再次执行上述查询:

SELECT * 
FROM t_demo 
WHERE id = 2 
FOR UPDATE SKIP LOCKED;

第二个查询不应返回任何结果,但它返回的结果为 2

【问题讨论】:

  • 您在锁定该行时尚未打开任何事务,因此锁定立即消失
  • 您可能启用了自动提交,因此每个语句都会自动提交,从而释放锁。具体如何更改取决于“一些 Postgres UI 客户端”。

标签: postgresql postgresql-9.5


【解决方案1】:

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FOR-UPDATE-SHARE

为了防止操作等待其他交易 提交,请使用 NOWAIT 或 SKIP LOCKED 选项

(强调我的)

如果您在一个窗口中运行这两个查询 - 您可能要么在一个事务中同时运行这两个查询(那么您的下一条语句不是其他事务)或在每个语句之后自动提交(默认)((但是您在第二个开始之前提交第一个语句事务,因此锁被释放,你观察到没有效果

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2019-04-16
    • 2019-01-29
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多