【发布时间】:2013-09-23 15:31:26
【问题描述】:
关于在 Postgres 函数中使用 SELECT ... FOR UPDATE 行级锁定,我有两个问题:
-
我选择哪些列是否重要?它们与我需要锁定然后更新哪些数据有任何关系吗?
SELECT * FROM table WHERE x=y FOR UPDATE;对
SELECT 1 FROM table WHERE x=y FOR UPDATE; 如果不将数据保存在某处,我无法在函数中进行选择,因此我保存到一个虚拟变量。这看起来很老套;这是正确的做事方式吗?
这是我的功能:
CREATE OR REPLACE FUNCTION update_message(v_1 INTEGER, v_timestamp INTEGER, v_version INTEGER)
RETURNS void AS $$
DECLARE
v_timestamp_conv TIMESTAMP;
dummy INTEGER;
BEGIN
SELECT timestamp 'epoch' + v_timestamp * interval '1 second' INTO v_timestamp_conv;
SELECT 1 INTO dummy FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;
UPDATE my_table SET (timestamp) = (v_timestamp_conv) WHERE userid=v_1 AND version < v_version;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
-
如果这真的是你的全部功能,那么
select .. for update没有任何用途。UPDATE也将锁定该行。如果你真的没有在SELECT和UPDATE之间做任何工作,你可以完全省略SELECT并让你的函数更快。
标签: postgresql plpgsql postgresql-9.1 select-for-update