我有一个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.');
}
答案 0 :(得分:1)
我可以确定即使创建多个文档也只能创建一次 客户正在尝试同时创建它?
Hein,关于您的担忧,您可以深入研究这个document,它在Cosmos DB中阐明了ACID。
在Azure Cosmos DB中,JavaScript运行时托管在数据库中 发动机。因此,在存储过程和 触发器在与数据库会话相同的范围内执行。这个 该功能使Azure Cosmos DB可以保证所有对象的ACID属性 存储过程或触发器的一部分的操作。对于 例子。
因此,我认为您的问题的答案是肯定的,因为原子性保证了事务内完成的所有操作都被视为一个单元,并且所有这些操作都已提交或全部都不提交。
顺便说一句,您也可以在创建收藏集之前设置一个或多个唯一键,请参阅此blog。