CouchDB-CouchDB 如何实现事务操作?

小组事务管理 小组事务管理 主题:974 回复:1955

CouchDB-CouchDB 如何实现事务操作?

虐人心 发布于 2017-06-22 字数 155 浏览 1004 回复 1

CouchDB存入数据库的数据先后不定,若我对某些数据的先后入库顺序有严格要求,那如何实现?
More: 对于nosql的事务操作实现有现成的源码或者解决方案吗?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(1

灵芸 2017-08-03 1 楼

对你的问题不是特别清楚,这里大致说一下CouchDB的事务处理。请把问题再说得详细点。

CouchDB没有传统意义上的事物处理支持,但它单个文档的操作都是保证ACID的,可以说你完全能够用它进行“事物性”的操作。CouchDB的事务性操作要分单节点和多节点两种情况来说。

单机CouchDB

如果你只有一个CouchDB节点,那么我不太明白你为什么说CouchDB存入数据先后顺序是不定的。例如,当你进行一次更新时,你必须知道该文档当前最新的版本号,如果你的版本号不是最新的,那么就不能完成更新。因此,当有多个client试图“同时”修改一个文档时,只有最先发起更新请求的那个client能够成功,其他请求都会因为版本号不是最新而失败(409 Conflict),这样就保证了更新是有序的。

事实上,CouchDB中文档的写操作(创建、更新、删除)都是被序列化的。在单机条件下(更确切的说是在只有单个写服务器的情况下),CouchDB是可以完成有序写的。

一个例外是批处理API,CouchDB可能会调整插入顺序以优化插入效率;另外,在CouchDB-0.9及以后的版本中,批处理没有事务性。例如,如果你使用批插入文档,其中某些插入失败不会导致本次批操作被取消掉。

这里有一个使用CouchDB处理银行事务的例子。
多个镜像写服务器的情况

这种情况下显然不可能保证写操作是ACID的。多个写服务器之间必然存在同步延迟,即使使用关系数据库也不可能保证ACID。在CouchDB中,多个数据库实例同步并发生冲突时,对同一个文档的不同修改都会存在数据库中(以不同版本号标记),CouchDB将自动选择一个版本作为最新的版本;开发者需要在应用层决定到底使用哪个版本作为最新版本。

个人觉得能最好就不要使用这种配置,要平衡写负载,用垂直划分多好啊。。