【问题标题】:Is it possible to let Postgres automatically retry transactions?是否可以让 Postgres 自动重试事务?
【发布时间】:2021-11-15 15:26:51
【问题描述】:

我正在开发一个 Django 应用程序,我希望在其中对数据的正确性有强有力的保证。为此,我将SERIALIZABLE 作为事务隔离级别。

但是,在负载测试期间,我看到了一些相关的错误消息:

由于事务之间的读/写依赖关系,无法序列化访问
详细信息:原因代码:在写入期间因识别为枢轴而取消。
提示:如果重试,事务可能会成功。

由于事务之间的读/写依赖关系,无法序列化访问
详细信息:原因代码:在读取期间因冲突而取消到枢轴 23933812。
提示:如果重试,事务可能会成功。

当前事务被中止,命令被忽略直到事务块结束

我确实通过 Django 自动重试事务,但我不确定这个解决方案是否真的很好。我想知道:是否可以让 Postgres 自动重试因这些原因而失败的事务? Django 中是否有直接允许我配置的东西? (不一定适用于所有交易;我知道失败更频繁/更重要的候选人)

【问题讨论】:

    标签: django postgresql transaction-isolation


    【解决方案1】:

    不,PostgreSQL 不提供这样的功能。如果 Django 有,那就太好了,你应该使用它。

    您应该捕获的 SQLSTATE 是 40P01(死锁)和 40001(序列化失败)。

    【讨论】:

    • “如果 Django 有” - 我不知道。我有自定义代码可以做到这一点,但我希望它直接由 Django 完成。例如,我想知道在下一次重试/退避之前等待是否有意义,哪些参数最好。
    • @Martinthoma 等待通常没有意义。在您可以处理错误之前,竞争进程已经完成或已经获得锁定。您可以立即重试。不能保证不会出现新的冲突,但永远不会出现。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2011-04-30
    • 2014-10-15
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多