我正在研究 NoSQL 作为数据库的扩展替代方案。如果我想要对此类事物敏感的基于事务的事物,我该怎么办?

有帮助吗?

解决方案

一般来说,NoSQL的解决方案比关系型数据库重量更轻事务语义,但仍然有原子操作设施在一定程度上。

一般地,做主 - 主复制的那些提供一致性的方式以下,更可用性。所以要选择合适的解决问题的正确工具。

许多盘成交在单个文件(或行等)的水平。例如用MongoDB中存在的单个文档的原子性 - 但文件可以相当丰富所以这通常工作得很好 - 更多信息的此处

其他提示

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

使用数据库事务将资金从一个银行帐户转移到另一个银行帐户的旧示例完全是胡说八道。正确的解决方案是存储分类账事件列表(账户之间的转账)并将当前余额显示为分类账的总和。如果您使用函数式语言进行编程(或以这种方式思考),这是显而易见的。

从: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (他的网站非常适合关于可扩展性的想法。)

我把上一段解释为:

  1. 为会员帐户创建数据库。
  2. 创建消息队列。昵称它为“分类帐”。
  3. 添加后台工作人员来完成队列中的每个请求。

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

客户(又名会员或客户)按照以下步骤提取资金:

  1. 提交提款请求。
  2. 请求被发送到服务器。
  3. 服务器将其放入队列中。消息是:“拿出五千块钱。”
  4. 客户端显示:“请求正在处理中,请稍等……”
  5. 客户端机器每 2 秒轮询一次服务器,询问“请求是否已得到满足?”
  6. 在服务器上,后台工作人员以先进/先出的方式满足其他成员先前的请求。最终,他们会满足您客户的取款请求。
  7. 一旦请求得到满足,客户就会收到一条包含新余额的消息。

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

总体思路似乎非常简单,而且比使用数据库中的事务要好得多,这使得扩展变得非常困难。

免责声明: 我还没有以任何方式实现这一点。我出于好奇而阅读这些内容,尽管我对它们没有实际需要。是的,@gbn 是对的,带有事务的 RDBMS 可能足以满足 Timmy 和我的需求。尽管如此,看看使用开源工具和一个名为“刀片龙卷风".

的NoSQL 覆盖一组不同的工具和服务,包括密钥值 - ,文档,图形和宽列存储。他们通常试图提高数据存储的可扩展性,通常是由分布数据处理。 交易需要星展如何执行用户的操作ACID属性。 ACID的可扩展性限制如何改进:大多数的NoSQL工具放松operatioins的一致性标准,以获得容错性和可用性进行缩放,这使得实现ACID事务很辛苦。

通常提到的分布式数据存储的理论推理是 CAP定理:一致性,可用性和分区容忍性不能同时实现。 SQL的NoSQL和NewSQL工具可以根据他们所放弃的东西进行分类;良好的数字可能被发现这里

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

只是想以金钱交易建议在此线程评论。事务是你真的想用钱转移到使用的东西。

给出如何阙转帐的例子是非常好的,整洁。

但在现实生活中转移资金可能包括费用或支付给其他帐户。人们得到的奖金使用来自另一个帐户或他们可能会从他们的帐户采取在同一系统中的另一个帐户的费用一定卡。费用或支付可以通过金融交易有所不同,你可能需要跟上簿记系统,显示信贷和每笔交易的借记卡,因为它涉及。

这意味着你要因为一个帐户信用可以在一个或多个账户被借记更新多行同时进行。首先,你锁定的行,所以没有什么可以更新之前改变,那么你作出书面确认数据与业务一致。

这就是为什么你真的想用交易。如果有错误写入一个行,你可以回滚一大堆的更新,而无须结束不一致的金融交易数据。

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

  1. 向收款人账户写入+$5,000
  2. 如果成功 - 将 -$5,000 写入发件人帐户
  3. 如果失败 - 重试或取消或显示消息

它将保证节省#1。但谁能保证#2 失败呢?逆序也是如此。

但这可以在没有事务的情况下使用 NoSQL 实现安全。您始终可以使用第三方实体,该实体将由发送方和接收方确认并保证您的操作已执行:

  1. 生成唯一交易id并创建交易实体
  2. 将+$5,000写入接收者账户(参考交易id)
  3. 如果成功 - 设置要发送的交易状态
  4. 将-$5,000写入sedned account账户(参考交易id)
  5. 如果成功 - 设置要接收的交易状态

该交易记录将保证发送/接收消息正常。现在,您可以通过交易 ID 检查每条消息,以及它的状态是否已收到或已完成 - 您可以将其计入用户余额。

取决于您的数据库,但是......我会说在一般情况下,你可以使用“乐观事务“来实现这一点,但我想应该确保了解数据库实现的原子保证(例如什么样的写和读操作都是原子)。

有似乎在网上一些讨论有关 HBase的交易,如果那是任何帮助。

您始终可以在 SQL 数据库中使用 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 也更容易调试,并且通常作为开发人员使用。

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

这就是为什么我创建的NoSQL文档存储解决方案,能够使用“真正的”交易对企业应用程序与非结构化数据方法的能力。看看 http://djondb.com 和随意添加你认为可能是有用的任何功能。

肯定还有其他人

如果它支持的比较和一套可以实现对NoSQL的解决方案顶部乐观事务。我写了一个例子,在 GitHub的页面如何做到这一点在MongoDB中一些解释,但可以重复它以任何适当的NoSQL溶液。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top