提问者:小点点

通用处理由于隔离级别可序列化而导致的SQL事务失败


PostgreSQL留档13.2.3. Serializable隔离级别声明:

使用这种技术的环境必须有一种处理序列化失败的通用方法(总是返回SQLSTATE值'40001'),因为很难准确预测哪些事务可能导致读/写依赖关系,需要回滚以防止序列化异常。

这是否像总是立即重试事务直到成功一样简单?伪代码:

while (true) {
    try {
        BEGIN TRANSACTION
        ...
        COMMIT TRANSACTION
    }
    catch (SQLSTATE == '40001') {
        continue; // retry
    }
    break; // succeed
}

它是否保证在某个时候成功?是否存在失败一次后不可能成功的情况?还可以/应该做什么?它是否取决于场景?也许有时更早的查询事务也必须重复?在这种情况下,广义的解决方案如何可能?

有没有这种通用处理机制的开源示例?或者任何描述不同方法的好资源(书籍、文章…)?


共1个答案

匿名用户

您的代码示例准确地显示了它应该如何完成。

序列化失败应该很少发生;如果没有,则您的数据库或应用程序设计中的某些内容是不健全的。

我想有可能构建一个交易永远不会成功的场景,但这在实践中没有问题。