【问题标题】:Locking a table so only one user at a time can update it锁定表,以便一次只有一个用户可以更新它
【发布时间】:2014-10-29 03:50:02
【问题描述】:

我有一个 PostgreSQL 数据库。它的一个表有时会更新,但至关重要的是,它不能由多个用户同时更新。更新完成后,应该允许另一个用户更新表

我可以只使用 PostgreSQL 限制一个用户同时更新表的访问权限吗?

【问题讨论】:

  • 是的,您可以在事务期间锁定表,但这是一个非常糟糕的主意,原因可能超出了这个问题的范围。

标签: postgresql


【解决方案1】:

当然,这样做很正常,但不是你想的那样。

这是正常的,有时也是解决并发问题的最简单方法:

  • BEGIN
  • LOCK TABLE ... IN EXCLUSIVE MODE
  • ... 执行一组复杂的更新/插入/删除
  • COMMIT

但只有在您不等待用户的情况下才可以。在事务期间,您只能将LOCK 保存在表上,由于许多原因,让长时间运行的事务在用户思考某事时保持打开状态是一个坏主意。由于用户不明显的原因,它往往会使应用程序的其他部分停止,它会在自动数据库清理过程中产生问题,它会鼓励死锁等等。馊主意。不要这样做:

  • BEGIN
  • LOCK TABLE ... IN EXCLUSIVE MODE
  • 等待用户告诉我下一步该做什么
  • 做用户让我做的事情
  • 重复直到用户说他们完成了
  • COMMIT

为此,您通常需要optimistic concurrency controladvisory locks 或应用程序管理的用户锁定方案。

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2020-06-09
    • 2011-10-16
    相关资源
    最近更新 更多