Получение блокировок на уровне строк в заказе

У меня есть таблица, где я обновляю несколько строк внутри транзакции.

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 ответов

Другие вопросы по тегам