Postgresql 如何锁定表格进行书写

Postgresql 如何锁定表格进行书写,postgresql,sequelize.js,Postgresql,Sequelize.js,我想在一段时间内锁定一个表格以便书写,同时保留它以供阅读。 可能吗? 理想情况下,我希望使用谓词锁定表(例如防止写入行“where country=france”)。如果您确实希望锁定此类插入,即查询应该挂起,并且只有在您允许的情况下才继续,则必须在表上放置共享锁,并保持事务打开 这通常不是一个好主意 如果要防止任何此类插入,即在尝试此类插入时引发错误,请在插入前创建一个触发器,该触发器在新的行满足条件时引发异常。如果确实要锁定此类插入,即查询应挂起并仅在允许时继续,您必须在表上放置共享锁,并保

我想在一段时间内锁定一个表格以便书写,同时保留它以供阅读。 可能吗? 理想情况下,我希望使用谓词锁定表(例如防止写入行“
where country=france
”)。

如果您确实希望锁定此类插入,即查询应该挂起,并且只有在您允许的情况下才继续,则必须在表上放置
共享
锁,并保持事务打开

这通常不是一个好主意

如果要防止任何此类插入,即在尝试此类插入时引发错误,请在插入前创建一个
触发器,该触发器在
新的
行满足条件时引发异常。

如果确实要锁定此类插入,即查询应挂起并仅在允许时继续,您必须在表上放置
共享
锁,并保持交易打开

这通常不是一个好主意


如果要防止任何此类插入,即在尝试此类插入时引发错误,请在插入前创建一个
触发器,该触发器在
新的
行满足条件时引发异常。

您可以使用
进行共享
锁定,它阻止其他事务执行,如
更新
删除
,同时允许
选择共享
。(详见文件:[13.3.2])

例如,有两个进程按以下顺序访问表
user\u table

  • 进程A:
    开始
  • 流程A:
    从用户_表中选择用户名,其中country=法国用于共享
  • 流程B:
    从用户_表中选择*进行共享在这里,进程B仍然可以读取表中的所有行)

  • 过程B:
    updateuser\u table SET username='test',其中country=france在这里,进程B被阻止,正在等待进程A完成其事务


  • 您可以将
    用于共享
    锁定,这会阻止其他事务执行,如
    更新
    删除
    ,同时允许
    选择共享
    。(详见文件:[13.3.2])

    例如,有两个进程按以下顺序访问表
    user\u table

  • 进程A:
    开始
  • 流程A:
    从用户_表中选择用户名,其中country=法国用于共享
  • 流程B:
    从用户_表中选择*进行共享在这里,进程B仍然可以读取表中的所有行)

  • 过程B:
    updateuser\u table SET username='test',其中country=france在这里,进程B被阻止,正在等待进程A完成其事务


  • “with a predicate”只会锁定行,而不是整个表。但你为什么认为你需要这个?你想用它解决的真正问题是什么?很少需要显式锁定。“带谓词”将只锁定行,而不是整个表。但你为什么认为你需要这个?你想用它解决的真正问题是什么?很少需要显式锁定。我关于这个问题的问题::)我关于这个问题的问题::)是的,但这并不妨碍插入带有
    country='france'
    的新行。是的,但这并不妨碍插入带有
    country='france'
    的新行。