我有以下plpgsql函数:
CREATE FUNCTION user_delete(
IN id INT4
)
RETURNS VOID
AS
$BODY$
BEGIN
DELETE FROM user_role WHERE user_id = id;
DELETE FROM user_permission WHERE user_id = id;
DELETE FROM permission_cache WHERE user_id = id;
DELETE FROM access WHERE user_id = id;
DELETE FROM "user" WHERE user_id = id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
是否可以通过一次选择更新查询来锁定所有表中与used_id相关的行?
答案 0 :(得分:1)
除非您的应用程序中存在竞争条件和大量并发负载,否则您通常不会需要来使用显式锁定。通常最好简化写访问,以便所有进程以相同的顺序访问表和行以避免死锁。 DELETE
命令收集锁定的速度与SELECT FOR UPDATE
一样快。
我认为只用一个SELECT FOR UPDATE
就可以做到这一点
只需按顺序锁定所有表中的行:
PERFORM 1 FROM user_role x WHERE x.user_id = id FOR UPDATE;
PERFORM 1 FROM user_permission x WHERE x.user_id = id FOR UPDATE;
...
锁定是“随时”收集的,并在交易结束时发布。由于函数自动位于事务内部,因此所有锁都至少保留到函数结束。
PERFORM
而不是SELECT
,因为您实际上并不想要返回任何行。