【问题标题】:Generalized handling of SQL transaction failures due to isolation level serializable由于隔离级别可序列化导致的 SQL 事务失败的通用处理
【发布时间】:2016-09-16 14:07:09
【问题描述】:

PostgreSQL documentation 13.2.3. Serializable Isolation Level 声明:

使用此技术的环境具有处理序列化失败的通用方法(总是返回 SQLSTATE 值“40001”)非常重要,因为很难准确预测哪些事务可能会导致读/写依赖,需要回滚以防止序列化异常。

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

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

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

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

【问题讨论】:

    标签: sql postgresql transactions isolation-level


    【解决方案1】:

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

    序列化失败应该很少发生;如果他们不这样做,那么您的数据库或应用程序设计中的某些内容是不健全的。

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

    【讨论】:

    • 你知道任何可以证明这一点的开源代码示例吗?
    • 你知道一个不同的例子吗?还是没有人用这个?
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 2017-10-20
    • 2011-01-31
    • 1970-01-01
    • 2019-03-17
    • 2017-07-04
    • 2012-03-19
    • 2021-12-06
    相关资源
    最近更新 更多