【发布时间】:2020-06-05 22:00:45
【问题描述】:
我想使用PostgreSQL transaction isolation 来确保数据的正确性,optimistic concurrency control 模式会自动重试冲突的事务,而不是我的应用程序预先锁定数据库行和表。
实现这一点的一种常用方法是,Web 应用程序 retries the transaction 在代码块内的特定次数或通过中间件层 replays the HTTP request,也称为 HTTP 请求重放。 Here is an example of such a middleware for Pyramid and Python web applications web。
我没有找到任何关于 Node.js 及其 PostgreSQL 驱动程序如何处理正在进行的两个并发事务并且一个由于读写冲突而无法通过的情况的好的信息。 PostgreSQL 将回滚其中一个事务,但这是如何向应用程序发出信号的呢?在 Python 中,PSQL 驱动程序会在这种情况下引发psycopg2.extensions.TransactionRollbackError。 For other SQL database drivers here are some exceptions they will raise.
当您将 SQL 事务隔离级别设置为 SERIALIZABLE 时,这种行为更为常见,因为您往往会在负载下遇到更多冲突,因此我想优雅地处理它,而不是向用户提供 HTTP 500。
我的问题是:
如果需要特殊处理且重试库不能独立,如何使用 PostgreSQL 和一些常见的 ORM 框架(如 TypeORM)检测脏读回滚?
-
是否有中间件(NestJS/Express.js/others)来处理这个问题,并在数据库驱动程序发生事务回滚时自动尝试重播 HTTP 请求 N 次?
【问题讨论】:
-
"如何检测脏读" - 这很简单:Postgres 不支持脏读,所以没有什么可以“检测”
-
删除了脏读位,所以希望这个问题现在更有意义。我只是想演示一下什么是与图像的事务冲突。
-
如果 Postgres 中没有脏读,我仍然不明白“脏读回滚”是什么意思
-
在链接中有更多信息,描述了其他编程语言的问题和解决方案。
标签: node.js postgresql typeorm node-postgres