postgresql - 如何触发 PostgresSQL 中的每个 INSERT 操作
问题描述
我在我的 API 中使用 Typeorm。问题在于afterInsert
在提交事务之前触发了订阅者挂钩。那是因为 ORM 本身不依赖 DB。它禁止我访问钩子中发生的所有事情中的数据记录,因为事务仍处于未决状态。你能给我一些关于如何解决这个问题的建议吗?
解决方案
一种方法是使用外部事件代理。
您在订阅者代码中推送到代理,例如 Redis 队列、Rabbitmq、aws SQS 或 kinesis、kafka...
您在另一个代码中收听队列,此时您的第一个事务应该已经提交。您将处理一个单独的事务,并且可以实现您的订阅者代码,该代码可以依赖于第一个事务的提交数据。
如果第一个事务的提交很长,那么使用 typeorm 订阅者将无法工作,因为即使使用事件代理,您也无法保证事务已提交。因此,您可以在事务完成后添加代码以推送代理,或者依赖可以推送事件代理的 sql 触发器,或者基于 typeorm 的版本列实现重试系统,这样您就可以确定更新已提交,最适合重试免费的事件代理,例如 kafka 或 SQS。
推荐阅读
- angular - Angular FormControl 对象能够接受任何类型的输入值,还是仅限于打字稿原始类型?
- python - FileNotFoundError 用 python 读取 csv 文件
- java - TextPosition 边界框 PDFBox
- sql-server - SQL Server UPDATE:如果参数不为空,则设置列
- swift - Swift - 如何获取 m3u8 直播的当前帧?
- amazon-web-services - 使用安全组限制 AWS EC2 出站流量
- java - 提供外部 Tomcat 时的 Spring Boot REST Web 服务端点
- mysql - 返回无重复的mysql行
- r - 使用 R 和 httr 发布表单
- c++ - 动态创建指针数组时,Visual Studio 不显示完整数组