postgresql - 隔离级别 = 可序列化 Postgres 会自动重启失败的事务还是我必须自己做
问题描述
我运行一个存储过程
....
select xxxx
if xxxx !found
insert xxxxx
do stuff with xxx
...
显然这里有一场比赛。我天真的期望是,如果我正确设置了事务隔离级别(可序列化),那么比赛将自动解决(通过透明重启,就像我使用过的其他数据库系统一样)。情况似乎并非如此。
我想我必须自己检测 40001 错误并重新提交失败的交易。
那是对的吗?有没有我可以在某处设置的标志说“请用魔法做”?
解决方案
是的,您必须检测 SQLSTATE 40001 并自己重复该事务。
数据库无法访问重复事务所需的所有信息。事务日志存储对数据库所做的物理更改,而不是 SQL 语句。
如果这是一个很长的事务,并且从一开始就有一个检查点,那么 PostgreSQL 甚至可能不再有事务日志。
推荐阅读
- html - 有没有办法在不影响可访问性的情况下将导航菜单的打开/关闭按钮放在 nav 元素之外?
- c# - ASP.net 应用程序中的 Security.System.Exception
- python - 美丽的汤:无法提取整个 unicode 文本
- git - 在本地网络上共享 Visual Studio 2019 存储库
- java - 通过简单的请求/响应正确使用 openapi 鉴别器
- javascript - DiscordJS 获取超过 100 条消息
- sql - 使用 OR 连接的 SQL 语句的查询表达式中的运行时错误“3075”
- python - 两个函数之一不写入文件
- arrays - 指向整数数组的 C 不兼容指针
- c++ - 如何比较参数包中的类型(包括引用限定符)和 std::function 参数的类型