pgsql选择更新多个表

时间:2013-08-12 17:39:36

标签: postgresql plpgsql

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

1 个答案:

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

锁定是“随时”收集的,并在交易结束时发布。由于函数自动位于事务内部,因此所有锁都至少保留到函数结束。

  • 在plpgsql函数中使用PERFORM而不是SELECT,因为您实际上并不想要返回任何行。
  • 小心名称冲突。我在我的示例中使用了表限定列名。