我运行一个存储过程

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

很明显这里有比赛。我天真的期望是,如果我正确地设置了事务隔离级别(可序列化),那么竞争将自动解决(通过透明重启,就像我使用过的其他数据库系统一样)。似乎不是这样。
我想我必须自己检测40001个错误并重新提交失败的事务。
是这样吗?有没有我可以在某处挂上“请用魔法”的旗子?

最佳答案

是的,您必须检测到SQLSTATE 40001并自己重复该事务。
数据库无法访问重复事务所需的所有信息。事务日志存储对数据库所做的物理更改,而不是SQL语句。
如果这是一个很长的事务,并且在它启动后有一个检查点,PostgreSQL甚至可能没有事务日志了。

10-06 13:59
查看更多