【问题标题】:Mongodb/Nested transactions : open transaction in another one not workingMongodb/嵌套事务:在另一个不工作的打开事务
【发布时间】:2019-11-21 16:25:36
【问题描述】:

我在我的网络服务器中使用 MongoDb 4.2。 当我在全局会话/事务 (T1) 中打开会话/事务 T2 时,T2 中的提交将持久保存在数据库中,并且无法在全局事务 T1 中取消。

我们如何实现这个嵌套事务? 我应该在我的网络服务器中只打开一个单例会话并在所有更新操作中使用它吗?

这是一个例子:

def remove_order_in_book(self, book, order):
        with self.start_session() as session:
            with session.start_transaction():
                book_collection.delete_one(..)

def remove_book_from_order(self, book):
   with client.start_session() as session:
         with session.start_transaction():
             orders = self.get_orders_of_book (book)
             for order in orders:
                self.remove_order_in_book(book, order)

感谢您的任何想法!

【问题讨论】:

    标签: mongodb transactions nested rollback


    【解决方案1】:

    MongoDB Transactions 与会话相关联;在任何给定时间,您最多可以有 一个 为会话打开事务。

    查看您的示例,您应该尝试将所有图书订单移除打包在一个事务中。您甚至可以在事务中使用collection.deleteMany()

    另外值得注意的是,如果会话结束并且有一个打开的事务,事务将中止。

    【讨论】:

    • Bachtiar,让我再举一个例子,我需要实现一个嵌套事务:在你的单元测试中,你会想要测试一个函数,它会在自己的事务中更新 Mongodb 中的某些内容。在单元测试结束时,您肯定希望回滚在测试函数中完成的所有提交以保留您的测试数据。你怎么能用 Mongodb 的事务/会话来做呢?在关系数据库中,我正在做的是打开一个可以取消任何中间提交的全局事务。谢谢!
    猜你喜欢
    • 2019-02-03
    • 2021-08-28
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多