with isolation level = serializable Postgres 会自动重启失败的事务还是我必须自己做

with isolation level = serializable will Postgres automatically restart the failed transaction or do I have to do it myself

我运行一个存储过程

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

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

我想我必须自己检测 40001 错误并重新提交失败的交易。

对吗?有没有我可以在某处设置的标志说 'please do it by magic'?

是的,您必须检测 SQLSTATE 40001 并自己重复交易。

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

而且如果它是一个长事务并且自启动以来一直有一个检查点,PostgreSQL 甚至可能不再有事务日志了。