是否可以让 Postgres 自动重试事务?

Is it possible to let Postgres automatically retry transactions?

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

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

could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during write.
HINT: The transaction might succeed if retried.

could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on conflict out to pivot 23933812, during read.
HINT: The transaction might succeed if retried.

current transaction is aborted, commands ignored until end of transaction block

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

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

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