如何在CosmosDb事务中隔离读后插入?



我正在尝试在CosmosDb中实现锁定。

我有一个存储过程,它试图读取一个记录,如果记录不存在-它试图创建记录。

问题是我偶尔会在插入(409)上遇到冲突。

这是我的问题存储过程:

function tryLock(lockId, createdDate, ttl) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var query = 'select * from root r where r.id = "' + lockId + '"';
collection.queryDocuments(collectionLink, query, {}, function(err, documents) {
if (err)
{
throw err;
}
if (documents.length > 0)
{
var existingDocument = documents[0];
var responseDoc = {locked: false, etag: existingDocument._etag, createdDate: existingDocument.createdDate };
response.setBody(responseDoc);
}
else
{
createNewLockRecord();
}
});
function createNewLockRecord() {
let lockItem = {id: lockId, createdDate: createdDate, ttl: ttl};
collection.createDocument(collectionLink, lockItem,
function (err, createdDocument) {
if (err) {
throw err;
}
response.setBody({locked: true, etag: createdDocument._etag, createdDate: createdDocument.createdDate});
});
}
}

我的问题是,我想要达到的目标有可能实现吗?

如果我改变操作的顺序,例如-尝试插入,如果它不成功-读取现有的记录,它会改善这种情况吗?

正如@George所提供的,还没有出现一个很好的解决'锁'问题的方案,而'自旋锁'似乎是一个选择。

——复制注释:只是重新尝试调用这个存储过程,希望它最终会达到未锁定状态,并成功创建一条记录。最初的实施大约失败了。2%的病例,但重试3次后,只有0.001%的病例失败。

相关内容

  • 没有找到相关文章

最新更新