首页 > 解决方案 > 如何触发 PostgresSQL 中的每个 INSERT 操作

问题描述

我在我的 API 中使用 Typeorm。问题在于afterInsert在提交事务之前触发了订阅者挂钩。那是因为 ORM 本身不依赖 DB。它禁止我访问钩子中发生的所有事情中的数据记录,因为事务仍处于未决状态。你能给我一些关于如何解决这个问题的建议吗?

标签: postgresqltypeorm

解决方案


一种方法是使用外部事件代理。

您在订阅者代码中推送到代理,例如 Redis 队列、Rabbitmq、aws SQS 或 kinesis、kafka...

您在另一个代码中收听队列,此时您的第一个事务应该已经提交。您将处理一个单独的事务,并且可以实现您的订阅者代码,该代码可以依赖于第一个事务的提交数据。

如果第一个事务的提交很长,那么使用 typeorm 订阅者将无法工作,因为即使使用事件代理,您也无法保证事务已提交。因此,您可以在事务完成后添加代码以推送代理,或者依赖可以推送事件代理的 sql 触发器,或者基于 typeorm 的版本列实现重试系统,这样您就可以确定更新已提交,最适合重试免费的事件代理,例如 kafka 或 SQS。


推荐阅读