Mongodb/вложенные транзакции: открытая транзакция в другой не работает

Я использую MongoDb 4.2 на своем веб-сервере. Когда я открываю сеанс/транзакцию T2 внутри глобального сеанса/транзакции (T1), фиксация внутри 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)

Спасибо за любую идею!


person Tibo    schedule 21.11.2019    source источник


Ответы (1)


MongoDB Транзакции связаны с сеансом; В любой момент времени у вас может быть не более одной открытой транзакции для сеанса.

Глядя на ваш пример, вы должны попытаться упаковать все удаление заказов на книги в одну транзакцию. Вы даже можете использовать collection.deleteMany() в сделка.

Также стоит отметить, что если сессия заканчивается и в ней есть открытая транзакция, транзакция прерывается.

person Wan Bachtiar    schedule 25.11.2019
comment
Бахтияр, позвольте мне привести еще один пример, когда мне нужно реализовать вложенную транзакцию: в вашем модульном тесте вы хотели бы протестировать функцию, которая будет обновлять что-то в MongoDB в своих собственных транзакциях. В конце модульного теста вы наверняка захотите отменить все фиксации, сделанные в тестируемой функции, чтобы сохранить ваши тестовые данные. Как вы могли бы сделать это с транзакцией/сеансом Mongodb? В реляционной базе данных я открываю глобальную транзакцию, которая может быть отменена любыми промежуточными фиксациями. Спасибо! - person Tibo; 25.11.2019