由于隔离级别可序列化

时间:2016-09-16 14:07:10

标签: sql postgresql transactions isolation-level

PostgreSQL documentation 13.2.3. Serializable Isolation Level州:

  

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

这是否一如既往地立即重试事务直到成功为止?伪代码:

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

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

是否有这种广义处理机制的开源示例?或者描述不同方法的任何好资源(书籍,文章......)?

1 个答案:

答案 0 :(得分:1)

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

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

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