Postgresql 并发更新,提交时使其他事务失败

Postgresql 并发更新,提交时使其他事务失败,postgresql,transactions,sql-update,Postgresql,Transactions,Sql Update,我有两个程序PCrit和PLong使用Postgres在同一张表上读写 PCrit非常关键,永远不会失败/阻塞 PLong需要在一个事务中读取、计算和更新很多内容,这可能需要几分钟的时间,但只要回滚所有更改,它就可能失败 行具有状态,如果状态为“已修复”,则PLong无法使用此状态更新行。 PCrit可以在第二个事务中仅处理这些行之前,将单个查询中的所有行快速更新为“已修复” 在大多数情况下,PCrit和PLong不会更新相同的行。但如果扑通一声需要太长时间才能跑完,这种情况可能会发生 如果PC

我有两个程序PCrit和PLong使用Postgres在同一张表上读写

PCrit非常关键,永远不会失败/阻塞

PLong需要在一个事务中读取、计算和更新很多内容,这可能需要几分钟的时间,但只要回滚所有更改,它就可能失败

行具有状态,如果状态为“已修复”,则PLong无法使用此状态更新行。 PCrit可以在第二个事务中仅处理这些行之前,将单个查询中的所有行快速更新为“已修复”

在大多数情况下,PCrit和PLong不会更新相同的行。但如果扑通一声需要太长时间才能跑完,这种情况可能会发生

如果PCrit运行并更新行,我希望PLong在碰到PCrit更新的任何行时无法提交

我考虑使用可重复读取事务级别

例如:

  • PLong开始其可重复读取事务
  • PCrit更新单个查询/事务中的某些行状态并提交
  • PLong更新了一些相同的行
  • PCrit提交(失败,由于并发更新,
    无法序列化访问)
  • 问题是当2和3反转时,PCrit将阻塞,直到PLong提交。 我希望PCrit不要阻止并能够提交,而是在提交时使PLong失败

    有可能用博士后吗?
    我应该改变我的设计来达到同样的目标吗?

    没有办法自动做到这一点

    您可以对PCrit使用非常低的
    lock\u timeout
    ,如果出现锁超时错误,请使用
    pg\u cancel\u backend
    杀死PLong