首页 > 解决方案 > Mongodb/嵌套事务:在另一个不工作的打开事务

问题描述

我在我的网络服务器中使用 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)

谢谢你的任何想法!

标签: mongodbtransactionsnestedrollback

解决方案


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

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

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


推荐阅读