关于在 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
并使您的函数更快。 - user330315