NoSQL中的事务?

我正在研究NoSQL扩展数据库的替代scheme。 如果我想要基于交易的事物对这些事情敏感,我该怎么办?

一般来说,NoSQL解决scheme比关系型数据库具有更轻量级的事务语义,但仍有一定程度的primefaces操作设施。

一般情况下,进行主 – 主复制的方式一致性较低,可用性较高。 所以应该为正确的问题select合适的工具。

许多提供在单个文档(或行等)级别的交易。 例如,在MongoDB中,单个文档具有primefaces性 – 但文档可能相当丰富,所以这通常工作得很好 – 这里有更多的信息。

这是我发现的最接近的答案,它适用于任何NoSQL数据库。 Heroku.com的Adam Wiggins在2007年发表了一篇博文:

使用数据库事务处理从一个银行账户转移到另一个银行账户的旧例子是总公牛。 正确的解决scheme是存储分类帐事件列表(账户间转账),并将当前余额显示为分类账的总和。 如果你用一种function语言编程(或者这样想),这是显而易见的。

来自: http : //adam.heroku.com/past/2007/12/17/a_world_without_sql/ (他的网站是伟大的想法的可扩展性。)

我将上述段落解释为:

  1. 创build成员帐户的数据库。
  2. 创build一个消息队列。 昵称“分类帐”。
  3. 添加后台工作人员以满足队列中的每个请求。

更多信息。 在排队/后台工作人员: http : //adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/

客户(即会员或客户)按照以下步骤取钱:

  1. 提交一个请求拿出钱。
  2. 请求被发送到服务器。
  3. 服务器将其放入队列中。 信息是:“拿出$ 5,000。”
  4. 客户端显示:“请等待请求正在实现…”
  5. 客户端机器每2秒询问一次服务器,询问“请求是否被满足?
  6. 在服务器上,后台工作人员以先进先出的方式履行其他成员的先前请求。 最终,他们得到您的客户的要求拿出钱。
  7. 一旦请求得到满足,客户就会收到一条新的消息。

如果您熟悉Node.js或Ruby / Rack,可以使用Heroku.com快速创build一个小实体模型。

总体思路看起来相当简单,比使用数据库中的事务要好很多。

免责声明:我还没有以任何方式实现这一点。 尽pipe我对他们没有实际的需要,但是我好奇地阅读了这些内容。 是的,@gbn是正确的,一个关系交易的RDBMS可能足以满足Timmy和我的需求。 尽pipe如此,看看你可以使用开源工具和一个名为“ 龙卷风龙卷风 ”的How-to网站来开发NoSQL数据库,这将会很有趣。

只是想在这个线程上对金钱交易build议发表评论。 交易是你真的想用汇款的东西。

给出的例子如何做转移是非常好的和整齐。

但在现实生活中转移资金可能包括其他账户的费用或支付。 人们可以使用来自其他帐户的某些卡片获得奖励,也可以从其帐户中将费用从同一系统中的其他帐户中获取。 费用或付款可能会因金融交易而有所不同,您可能需要保持显示每笔交易信用和借记的簿记系统。

这意味着您要同时更新多行,因为一个账户的信用可以在一个或多个账户上借记。 首先你locking行,所以在更新之前没有什么可以改变,那么你要确保写入的数据与事务一致。

这就是为什么你真的想使用交易。 如果写入一行时出现任何问题,则可以回滚大量更新,而金融事务数据的结尾不一致。

NoSQL涵盖了各种各样的工具和服务,包括键值,文档,图表和宽列商店。 他们通常会尝试通过分布数据处理来提高数据存储的可伸缩性。 关系数据库的预期ACID属性(也定义了正确的事务处理)限制了可伸缩性如何提高:我们必须在放弃可伸缩性,一致性或容错性之间进行select,而且大多数工具会放弃一致性,因此会导致ACID。

一个常见的定理是CAP定理 :一致性,可用性和分区容差不能同时达到。 SQL,NoSQL和NewSQL工具可以根据他们放弃什么进行分类; 在这里可以find一个好的身材。

替代ACID的一套新的,较弱的要求是BASE (“基本上是一个有争议的,软状态,最终一致性”)。 然而,最终一致的工具(“最终所有访问项目将返回最后更新的值”)在银行业务等交易应用程序中难以接受。 在这里,一个好主意是使用内存中的,面向列的和分布式的SQL / ACID数据库,例如VoltDB ; 我build议看看这些“NewSQL”解决scheme。

一个交易和两个操作(例如一个支付$ 5,000,第二个收到$ 5,000)的问题是 – 您有两个具有相同优先级的账户。 您不能使用一个帐户来确认第二个(或以相反的顺序)。 在这种情况下,你可以保证只有一个帐户将是正确的(即确认),第二(确认)可能已经失败。 让我们看看为什么它可以失败(使用消息aproatch,发件人是由接收器确认):

  1. 写$ 5,000给接收者帐户
  2. 如果成功 – 写入 – $ 5,000发件人帐户
  3. 如果失败 – 请重试或取消或显示消息

这将保证#1的保证。 但是,如果#2失败,谁保证? 相反的顺序。

但是这可以被实现为没有事务和NoSQL的安全。 您总是被允许使用第三方实体,这将从发送方和接收方确认,并保证您的操作已执行:

  1. 生成唯一的事务ID并创build事务实体
  2. 向收款人帐户写入+ $ 5,000(参考交易ID)
  3. 如果成功 – 设置交易状态发送
  4. 写 – $ 5,000到sedned帐户帐户(参考交易ID)
  5. 如果成功 – 设置交易的状态接收

此交易logging将保证发送/接收按摩是可以的。 现在你可以检查每个消息的交易ID,如果它的状态已经收到或完成 – 你把它考虑到用户的平衡。

取决于你的数据库,但是…一般来说,你可以使用'乐观事务'来实现这个目标,但我想应该确保理解数据库实现的primefaces性保证(例如,什么样的读写操作是primefaces的)。

网上似乎有一些关于HBase交易的讨论 ,如果有什么帮助的话。

您可以在SQL DB中始终使用NoSQL方法。 NoSQL似乎通常使用“键/值数据存储”:您始终可以在您首选的RDBMS中实现这一点,从而保持事务,ACID属性,友好的DBA支持等优点,同时实现NoSQL性能和灵活性的好处,例如通过一个表格如

CREATE TABLE MY_KEY_VALUE_DATA ( id_content INTEGER PRIMARY KEY, b_content BLOB ); 

奖金是你可以在这里添加额外的字段,将你的内容链接到其他正确的关系表,同时仍然保持你的笨重的内容在主BLOB(或文本,如果适当)领域。

就我个人而言,我喜欢使用TEXT表示,所以你不会被绑定到使用数据的语言,例如使用序列化的Java意味着你可以从Perl访问内容进行报告。 TEXT也更容易debugging,通常作为开发人员使用。

看看scalaris它的一个没有强大的一致性和实施交易的SQL数据库。

这就是为什么我要创buildNoSQL文档存储解决scheme,以便能够使用非结构化数据方法的强大function在企业应用程序上使用“真实”事务。 看看http://djondb.com ,随时添加你认为可能有用的function。

  • 新的键值存储FoundationDB
  • 旧的键值存储Berkley DB

当然还有其他的

如果支持比较和设置,您可以在NoSQL解决scheme的基础上实施乐观交易。 我在一个GitHub页面上写了一个例子和一些解释,如何在MongoDB中做到这一点,但你可以在任何合适的NoSQL解决scheme中重复。