1

我有以下 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 相关的行?

4

1 回答 1

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;
...

锁“随用随取”并在事务结束时释放。由于函数自动位于事务内部,因此所有锁至少会保留到函数结束。

  • 在 plpgsql 函数中使用PERFORM而不是SELECT,因为您实际上并不希望返回任何行。
  • 谨防名称冲突。我在示例中使用了表限定的列名。
于 2013-08-12T18:23:33.220 回答