如何触发 PostgresQL 中的每个 INSERT 操作
How do I trigger on every INSERT action in PostgresSQL
我在 API 中使用 Typeorm。问题是 afterInsert
在提交事务之前触发订阅者挂钩。那是因为它不依赖ORM本身的DB。它禁止我在钩子中发生的所有事情中访问数据记录,因为事务仍在挂起。你能给我一些解决这个问题的建议吗?
一种方法是使用外部事件代理。
您在订阅者代码中推送到代理,例如 Redis 队列、Rabbitmq、aws SQS 或 kinesis、kafka...
你在另一个代码中监听队列,此时你的第一个事务应该已经提交。您将处理一个单独的事务,并可以实现您的订阅者代码,该代码可以依赖第一个事务的提交数据。
如果第一个事务的提交很长,那么使用 typeorm 订阅者将不起作用,因为即使使用事件代理,您也无法保证事务已提交。那么你可以在事务完成后添加代码来推送代理,或者依赖 sql 可以推送事件代理的触发器,或者实现基于 typeorm 版本列的重试系统,这样你就可以了确保更新已提交,最适合重试免费的事件代理,例如 kafka 或 SQS。
我在 API 中使用 Typeorm。问题是 afterInsert
在提交事务之前触发订阅者挂钩。那是因为它不依赖ORM本身的DB。它禁止我在钩子中发生的所有事情中访问数据记录,因为事务仍在挂起。你能给我一些解决这个问题的建议吗?
一种方法是使用外部事件代理。
您在订阅者代码中推送到代理,例如 Redis 队列、Rabbitmq、aws SQS 或 kinesis、kafka...
你在另一个代码中监听队列,此时你的第一个事务应该已经提交。您将处理一个单独的事务,并可以实现您的订阅者代码,该代码可以依赖第一个事务的提交数据。
如果第一个事务的提交很长,那么使用 typeorm 订阅者将不起作用,因为即使使用事件代理,您也无法保证事务已提交。那么你可以在事务完成后添加代码来推送代理,或者依赖 sql 可以推送事件代理的触发器,或者实现基于 typeorm 版本列的重试系统,这样你就可以了确保更新已提交,最适合重试免费的事件代理,例如 kafka 或 SQS。