代码之家  ›  专栏  ›  技术社区  ›  pm100

如果isolation level=serializable,Postgres将自动重新启动失败的事务,还是我必须自己执行它?

  •  1
  • pm100  · 技术社区  · 6 年前

    我运行一个存储过程

    ....
    select xxxx
    if xxxx !found 
       insert xxxxx
    do stuff with xxx
    ...
    

    显然这里有一场比赛。我幼稚的期望是,如果我正确地设置了事务隔离级别(可序列化),那么竞争将自动解决(通过透明重新启动,就像我处理过的其他DB系统一样)。似乎情况并非如此。

    我想我必须自己检测40001错误,然后重新提交失败的事务。

    对吗?有没有我可以在某个地方设置的标志来表示“请用魔法来做”?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Laurenz Albe    6 年前

    是的,您必须检测到sqlstate 40001并自己重复该事务。

    数据库无法访问重复事务所需的所有信息。事务日志存储对数据库所做的物理更改,而不是SQL语句。

    如果这是一个长的事务,并且自启动之后就有了一个检查点,那么PostgreSQL可能再也没有事务日志了。