【问题标题】:Update taking a row lock更新获取行锁
【发布时间】:2015-07-16 21:58:30
【问题描述】:

我在 postgres 中有以下查询。

CREATE SCHEMA s;
CREATE TABLE s.t1 (
    "id1" Bigint,
    "id2" Bigint,
    "id3" Boolean DEFAULT false NOT NULL,
    CONSTRAINT "pk1" PRIMARY KEY (id1)
)    
WITH(OIDS=FALSE);

INSERT INTO s.t1 (id1, id2, id3) VALUES (1, 22, true);
INSERT INTO s.t1 (id1, id2) VALUES (2, 22);
INSERT INTO s.t1 (id1, id2) VALUES (3, 33);

SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22  and id3 = true FOR UPDATE); /* Does it take a lock on the row. */

SELECT id3 FROM s.t1 WHERE id2 = 22  and id3 = true FOR UPDATE; /* Takes a lock on the row. */

DROP SCHEMA s CASCADE; 

我了解第二个查询会在特定行上锁定(在事务下运行时)。没有其他查询将能够访问 直到事务提交为止。

在事务下运行时,第一个查询是否也锁定了行?

谢谢

【问题讨论】:

    标签: database postgresql sql-update locking


    【解决方案1】:
    SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22  and id3 = true FOR UPDATE);
    /* Does it take a lock on the row. */
    

    是的。查询检索到的所有行都被锁定。查询返回的形式以及它们是否返回都无关紧要。

    如果子查询锁定了某些行,则外部查询可能会减少锁定的行数(如果它减少了检索的行数)。在这种情况下,外部查询将锁定的行数减少到一行。

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2018-05-09
      相关资源
      最近更新 更多