获取订单中的行级锁定

时间:2016-10-27 14:38:05

标签: sql postgresql database-deadlocks

我有一个表,我在事务中更新多行。

DROP SCHEMA IF EXISTS s CASCADE;  

CREATE SCHEMA s;
CREATE TABLE s.t1 (
    "id1" Bigint,
    "id2" Bigint,
    CONSTRAINT "pk1" PRIMARY KEY (id1)
)   
WITH(OIDS=FALSE);

INSERT INTO s.t1( id1, id2 )
SELECT x, x * 100 
FROM generate_series( 1,10 ) x;

END TRANSACTION;
BEGIN TRANSACTION;
SELECT id1 FROM s.t1 WHERE id1 > 3 and id1 < 6 ORDER BY id1 FOR UPDATE; /* row lock */

我假设这将按顺序(id1)采用行级锁。 我的假设是否正确?

这样我就可以运行多个事务而不必担心由于行上的锁定顺序导致的死锁。

END TRANSACTION;
BEGIN TRANSACTION;
SELECT id1,id2 FROM s.t1 order by id1;

DROP SCHEMA s CASCADE;  

我做了解释。

EXPLAIN SELECT id1 FROM s.t1 WHERE id1 > 3 and id1 < 6 ORDER BY id1 FOR  UPDATE;
                              QUERY PLAN
------------------------------------------------------------------------------
 LockRows  (cost=15.05..15.16 rows=9 width=14)
   ->  Sort  (cost=15.05..15.07 rows=9 width=14)
     Sort Key: id1
     ->  Bitmap Heap Scan on t1  (cost=4.34..14.91 rows=9 width=14)
           Recheck Cond: ((id1 > 3) AND (id1 < 6))
           ->  Bitmap Index Scan on pk1  (cost=0.00..4.34 rows=9 width=0)
                 Index Cond: ((id1 > 3) AND (id1 < 6))
(7 rows)

答:这是正确的。

由于

0 个答案:

没有答案