我可以检查唯一性并在Cosmos DB存储过程中写文档

时间:2019-01-30 14:46:02

标签: stored-procedures azure-cosmosdb

我有一个Cosmos DB存储过程,该过程将创建一个新文档(如果尚不存在)并返回现有文档或新文档。该过程可以从不同的过程调用。我可以确定即使多个客户端试图同时创建该文档也只能创建一次?

function createIfNotExists(param1, param2) {
    var collection = getContext().getCollection();

    // Query documents and take 1st item.
    var query = 'SELECT * FROM c WHERE c.Param1="' + param1 + '" AND c.Param2="' + param2 + '"';
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        query,
        function (err, items, options) {
            if (err) throw err;

            var response = getContext().getResponse();
            if (!items || !items.length) {
                var accepted = collection.createDocument(collection.getSelfLink(),
                {
                    Param1: param1,
                    Param2: param2
                },
                function (err, itemCreated) {
                    if (err) throw err;
                    response.setBody(itemCreated);
                });

                if (!accepted) throw new Error('Could not create document');
            }
            else {
                response.setBody(items[0]);
            }
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

1 个答案:

答案 0 :(得分:1)

  

我可以确定即使创建多个文档也只能创建一次   客户正在尝试同时创建它?

Hein,关于您的担忧,您可以深入研究这个document,它在Cosmos DB中阐明了ACID。

  

在Azure Cosmos DB中,JavaScript运行时托管在数据库中   发动机。因此,在存储过程和   触发器在与数据库会话相同的范围内执行。这个   该功能使Azure Cosmos DB可以保证所有对象的ACID属性   存储过程或触发器的一部分的操作。对于   例子。

因此,我认为您的问题的答案是肯定的,因为原子性保证了事务内完成的所有操作都被视为一个单元,并且所有这些操作都已提交或全部都不提交。

顺便说一句,您也可以在创建收藏集之前设置一个或多个唯一键,请参阅此blog