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



我有一个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.');
}

我能确定文档只创建一次吗客户端正在尝试同时创建它?

Hein,关于您的担忧,您可以深入研究这篇阐述Cosmos DB中ACID的文档。

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

所以,我认为你的问题的答案是肯定的,因为原子性保证事务中完成的所有操作都被视为一个单元,要么全部提交,要么没有提交。

顺便说一句,你也可以在创建集合之前设置一个或多个唯一的密钥,请参阅本博客。

最新更新