【发布时间】:2021-09-01 19:34:19
【问题描述】:
我有这两个函数作为互斥锁和解锁:
CREATE OR REPLACE FUNCTION get_config (guildid_in int8, key_in varchar) RETURNS jsonb AS $$
DECLARE d JSONB;
BEGIN
WHILE (SELECT locked FROM guild_options WHERE guildid = guildid_in AND key = key_in) LOOP END LOOP;
UPDATE guild_options SET locked = true WHERE guildid = guildid_in AND key = key_in;
SELECT data INTO d FROM guild_options WHERE guildid = guildid_in AND key = key_in ;
REtURN d;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION set_config (guildid_in int8, key_in varchar, data_in jsonb) RETURNS void AS $$
BEGIN
UPDATE guild_options SET locked = false, data = data_in WHERE guildid = guildid_in AND key = key_in;
END;
$$ LANGUAGE plpgsql;
我有这两个功能的原因是因为我不希望不同客户端之间的数据竞争覆盖数据等等,这允许我锁定一条数据,修改它然后解锁以供其他客户端读取/更新.我没有使用 postgres 锁(表锁、行锁、咨询锁),因为我需要锁定多个事务的能力,并且因为我在程序中使用数据库池,所以我不能使用咨询锁,因为有多个会话一次连接到数据库,我无法控制哪一个锁定/解锁
有没有更好的方法来做到这一点(比如更好的轮询)?
【问题讨论】:
标签: sql postgresql locks