【发布时间】:2016-01-20 14:19:43
【问题描述】:
CREATE TABLE t1 (
id serial int,
col text
);
insert into t1(col) values('old_value');
现在,我需要锁定此表以防止数据修改,而下面的 plsql 块正在运行
DO $$
declare
res1 TEXT;
res2 TEXT;
BEGIN
--PERFORM pg_advisory_lock( )
select col from t1 where id = 1 into res1;
FOR i in 1..2000000000 LOOP
-- this is just for waiting several second
END LOOP;
select col from t1 where id = 1 into res2;
RAISE NOTICE '% - %', res1, res2;
--PERFORM pg_advisory_unlock( )
END;
$$ LANGUAGE PLPGSQL
所以当这个块运行时,我运行其他查询:
update t1 SET col = 'new_value' where id = 1;
当运行 plsql 块未完成时,此查询立即生效并更新行。
我需要相反,我需要更新不工作并等待,而 plsql 块运行。
我想pg_advisory_lock() 和pg_advisory_unlock() 会有所帮助,但是如何使用,我不明白,这些功能的关键参数是什么,我不明白。
而且也不确定这些功能是否会起作用。
任何帮助将不胜感激。
【问题讨论】:
标签: database postgresql plpgsql postgresql-9.4