【问题标题】:MongoDB transactions spanning multiple web requests跨越多个 Web 请求的 MongoDB 事务
【发布时间】:2020-12-18 23:11:36
【问题描述】:

我正在尝试使用 Go 通过 HTTP 实现 MongoDB 事务 API 服务 客户端发送请求到:/db/transaction/begin 获取交易 ID 为了将所有后续与事务相关的 CRUD 操作 API 请求与该事务 ID 绑定 最后客户端要么向/db/transaction/{transaction_id}/commit发送请求 或/db/transaction/{transaction_id}/rollback (有点类似于 Firestore 事务)

我能够使用 ArangoDB 实现这种行为,因为它的 Go Driver 允许我设置每个 CRUD 操作的事务 ID (https://godoc.org/github.com/arangodb/go-driver#WithTransactionID)

但不幸的是,我无法使用官方的 MongoDB Go 驱动程序实现这一目标

我错过了什么吗? 是否有解决方法或任何自定义实现可以帮助我?

提前致谢

【问题讨论】:

    标签: mongodb go transactions atomic


    【解决方案1】:

    更简单的解决方案是将操作存储(缓冲)在应用程序中,并在提交端点运行时将它们一起提交给 MongoDB。

    从技术上讲,您可以在应用程序中手动管理事务生命周期并实现跨 Web 请求的事务,但这是 1)会非常尴尬,2)您将失去驱动程序在withTransaction API。

    为此:

    分叉和修补驱动程序可能更容易,但这显然还有其他问题,因为您的代码库与官方驱动程序代码库不同。

    【讨论】:

    • 如果客户端只想进行批量写入,这将正常工作,但是当客户端需要先获取文档以在执行任何操作之前根据某些客户端域逻辑规则进行检查时,就会出现问题写入(postgres:选择更新...)。与事务相关的 CRUD 操作需要是无状态的,并且在服务器端是独立的,除了唯一的事务 ID 以在提交时将它们分组为原子操作。
    • 当我考虑更多时,您需要在应用程序中重新实现会话和事务处理,因为驱动程序可能也不允许您在外部设置会话 ID。可行,但工作量很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2019-05-17
    • 2017-12-27
    • 2011-10-25
    • 1970-01-01
    • 2014-01-20
    • 2017-11-08
    相关资源
    最近更新 更多