如何在CouchDB中实现分布式事务?

时间:2016-05-23 09:55:02

标签: hadoop couchdb distributed-transactions

我们正在将我们的数据库从oracle移动到couchDB,其中一个用例是实现分布式事务管理。 对于Ex:从JMS Queue读取数据并在多个文档中更新它,如果有任何失败则返回并向JMS队列抛出异常。 我们知道couchDB不支持分布式事务管理。 您能否建议任何其他策略来实现这个或任何其他出路?

2 个答案:

答案 0 :(得分:0)

CouchDB没有分布式事务所必需的属性,因此不可能。所有主要的分布式事务算法(两阶段提交协议,RAMP和Percolator式分布式事务,您可以在此answer中找到详细信息)都需要在记录级别上进行线性化。不幸的是,CouchDB是一个AP解决方案(在CAP定理意义上),所以它甚至不能保证记录级的一致性。

原因是你可以禁用复制以使CouchDB保持一致,但是你将失去容错能力。另一个选择是使用CouchDB作为存储并在其上构建一致的数据库,但它对您的任务来说太过分了,并且不使用任何特定于CouchDB的功能。第三种选择是使用CRDT,但仅当您的交易是可交换的时才有效。

答案 1 :(得分:0)

除了技术方面之外,我觉得你可能会对此感兴趣。

由于提到的分布式事务是不可能的 - 这个概念甚至不存在,因为它没有必要。事实上,与关系世界不同,95%的时候,当你觉得自己需要它时,就意味着你做错了。

我会直截了当地说:将关系数据转储到couchdb最终会成为写入和读取的噩梦。首先你会说:我怎么做交易?对于laters:我怎么做连接?两者都是不可能的,甚至是不存在的概念。

方便的结论 - 很多人都认为“CouchDb不是企业就绪或ACID就足够了”。但事实是你需要花时间重新思考你的数据结构。

你需要重新考虑你的数据结构并使它们以文档为导向,因为如果你不这样做,你就不能使用couchdb了 - 而且你知道这是冒险的领域。

阅读DDD并聚合设计,并将您的记录转换为DDD实体和聚合。所以CouchDb会有一个ETL层。如果你没有时间这样做,我建议不要使用CouchDb - 尽管我喜欢它。