首页 > 解决方案 > 隔离级别 = 可序列化 Postgres 会自动重启失败的事务还是我必须自己做

问题描述

我运行一个存储过程

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

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

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

那是对的吗?有没有我可以在某处设置的标志说“请用魔法做”?

标签: postgresqltransaction-isolation

解决方案


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

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

如果这是一个很长的事务,并且从一开始就有一个检查点,那么 PostgreSQL 甚至可能不再有事务日志。


推荐阅读