transactions - 使用 CouchDB 对两个文档进行类似事务的更新

标签 transactions couchdb nosql

作为 CouchDB 或 NoSQL 的新手,我通常找不到更新两个文档的好方法,并保证要么都更新,要么都不更新。

在我的用例中,每个文档中都有一个 bool 标志。为了说明这一点,我们假设我正在谈论带有 bool 属性 isKing 的 type="citizen"文档。我想确保一次只有一位国王。当我想更换国王时,事情就变得棘手了。这需要修改两个文件(为新国王设置isKing=true,为旧国王设置isKing=false)。

在一些不幸的并发更新之后,如何确保我不会最终得到两个或零个国王?

我在想bulk update ,但它没有帮助,因为它不支持事务。

编辑:我见过问题 Can I do transactions and locks in CouchDB? ,但它没有解决我的情况。它还与 CouchDB 中的事务相关,但相似之处仅此而已。问题在于以事务方式读取和更新一个文档,而我正在询问两个文档的事务更新。我发现其他问题的答案对我的案例没有帮助,但如果您认为它重复,请解释原因。

最佳答案

Transactional Semantics with Bulk Updates

In short, there are none (by design). However, you can ask CouchDB to check that all the documents in your _bulk_docs request pass all your validation functions. If even one fails, none of the documents are written. You can select this mode by including "all_or_nothing":true in your request.

通过比较 oldDoc._revnewDoc._rev,在自己的 validate_doc_update 函数中处理修订验证。

如果您让一个文档的验证失败 - 其他文档也不会被写入。

注意!!!答案仅对 CouchDB v1 有效。 CouchDB v2 忽略“all_or_nothing”属性。

关于transactions - 使用 CouchDB 对两个文档进行类似事务的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29491618/

相关文章:

c++ - mongodb 查找后跟更新语义

sql - 就速度而言,SQL 数据库中的主键查询是否类似于 NoSQL 数据库中的键查询?

transactions - Loopback4 中的事务支持吗?

couchdb - 如何在 Cloudant 或 CouchDB 中使用 skip 参数?

c# - 事务中的 Firebird DDL + DML 语句

makefile - cp : cannot stat ‘share/docs/html’ : No such file or directory

database - Couchdb:使用curl从所有数据库获取所有文档

git - 有没有比 Git 更好的数据库(具有可序列化、不可变、版本化的树)?

php - MySQL 自动提交与 begin_transaction

java - 使用java处理sqlite事务