更新时间:2025-05-29 GMT+08:00

LockRows

算子说明

LockRows算子用于锁定查询结果集中的行,以防止其他事务对这些行进行修改或删除。

典型场景

  • 事务中使用SELECT ... FOR SHARE/UPDATE锁定行,防止其他事务对这些行进行修改或删除。
  • 使用FOR SHARE锁定行时,当前事务和其他事务都无法修改或删除锁定行。
  • 使用FOR UPDATE锁定行时,除了当前事务,其他事务都无法修改或删除锁定行。

示例

示例:SELECT FOR UPDATE语法。

--数据准备。
gaussdb=# CREATE TABLE t(a int, b int, c int); 
CREATE TABLE 
gaussdb=# INSERT INTO t VALUES(generate_series(1, 10), generate_series(601, 610), generate_series(901, 910)); 
INSERT 0 10

--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM t WHERE a = 1 FOR UPDATE; 
                        QUERY PLAN                         
---------------------------------------------------------- 
 LockRows  (cost=0.00..34.41 rows=10 width=18) 
   ->  Seq Scan on t  (cost=0.00..34.31 rows=10 width=18) 
         Filter: (a = 1) 
(3 rows)

--删除。
gaussdb=# DROP TABLE t;

示例:SELECT FOR SHARE语法。

--数据准备 
gaussdb=# DROP TABLE IF EXISTS t;
gaussdb=# CREATE TABLE t(a int, b int, c int); 
CREATE TABLE 
gaussdb=# INSERT INTO t VALUES(generate_series(1, 10), generate_series(601, 610), generate_series(901, 910)); 
INSERT 0 10

--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM t WHERE a = 1 FOR SHARE; 
                        QUERY PLAN
----------------------------------------------------------
 LockRows  (cost=0.00..34.41 rows=10 width=18)
   ->  Seq Scan on t  (cost=0.00..34.31 rows=10 width=18)
         Filter: (a = 1)
(3 rows)

--删除。
gaussdb=# DROP TABLE t;

上述示例中,LockRows算子输出信息如下所示。

信息名称

含义

LockRows

算子名称。

Seq Scan

算子名称。