Поделиться через


Использование транзакций с несколькими документами в Azure Cosmos DB для MongoDB

Область применения: MongoDB

В этой статье вы создадите приложение оболочки Mongo, которое выполняет многодокументную транзакцию в фиксированной коллекции в Azure Cosmos DB для MongoDB с сервером версии 4.0.

Что такое транзакции с несколькими документами?

В Azure Cosmos DB для MongoDB операции с одним документом являются атомарными. Транзакции с несколькими документами позволяют приложениям выполнять атомарные операции в нескольких документах. Для операций предлагается семантика "все или ничего". При фиксации изменения, внесенные в транзакции, сохраняются, и если транзакция завершается ошибкой, все изменения в транзакции отменяются.

Транзакции с несколькими документами выполняются согласно семантике ACID:

  • Атомарность: все операции рассматриваются как единое целое
  • Согласованность: зафиксированные данные достоверные
  • Изоляция: изолированность от других операций
  • Устойчивость: данные транзакций сохраняются при наличии соответствующего требования для клиента

Требования

Транзакции с несколькими документами поддерживаются в несегментированной коллекции в API версии 4.0. Транзакции с несколькими документами не поддерживаются между коллекциями или в сегментированных коллекциях в версии 4.0. Время ожидания транзакций составляет 5 секунд.

Все драйверы, поддерживающие проводной протокол версии 4.0 или более поздней, будут поддерживать транзакции Azure Cosmos DB для MongoDB с несколькими документами.

Выполнение транзакций с несколькими документами в оболочке MongoDB

Примечание.

Этот пример не работает в бета-версии MongoSH (оболочке), встроенной в MongoDB Compass.

  1. Откройте командную строку и перейдите в каталог, где установлена оболочка Mongo версии 4.0 и выше:

    cd <path_to_mongo_shell_>
    
  2. Создайте скрипт оболочки Mongo connect_friends.js и добавьте следующее содержимое

    // insert data into friends collection
    db.getMongo().getDB("users").friends.insert({name:"Tom"})
    db.getMongo().getDB("users").friends.insert({name:"Mike"})
    // start transaction
    var session = db.getMongo().startSession();
    var friendsCollection = session.getDatabase("users").friends;
    session.startTransaction();
    // operations in transaction
    try {
        friendsCollection.updateOne({ name: "Tom" }, { $set: { friendOf: "Mike" } } );
        friendsCollection.updateOne({ name: "Mike" }, { $set: { friendOf: "Tom" } } );
    } catch (error) {
        // abort transaction on error
        session.abortTransaction();
        throw error;
    }
    
    // commit transaction
    session.commitTransaction();
    
  3. Выполните следующую команду для проведения транзакции с несколькими документами. Узел, порт, пользователь и ключ можно найти на портале Azure.

    mongo "<HOST>:<PORT>" -u "<USER>" -p "KEY" --ssl connect_friends.js
    

Следующие шаги

Узнайте о новых возможностях Azure Cosmos DB для MongoDB 4.0