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 甚至可能不再有事务日志了。
我运行一个存储过程
....
select xxxx
if xxxx !found
insert xxxxx
do stuff with xxx
...
显然这里有一场比赛。我天真的期望是,如果我正确设置事务隔离级别(可序列化),那么竞争将自动解决(通过透明重启,就像我使用过的其他数据库系统一样)。情况似乎并非如此。
我想我必须自己检测 40001 错误并重新提交失败的交易。
对吗?有没有我可以在某处设置的标志说 'please do it by magic'?
是的,您必须检测 SQLSTATE 40001 并自己重复交易。
数据库无法访问重复交易所需的所有信息。事务日志存储对数据库所做的物理更改,而不是 SQL 语句。
而且如果它是一个长事务并且自启动以来一直有一个检查点,PostgreSQL 甚至可能不再有事务日志了。