Transactions NoSQL中的事务?

Transactions NoSQL中的事务?,transactions,nosql,Transactions,Nosql,我正在研究NoSQL以扩展数据库的替代方案。如果我想要基于事务的东西对这类东西敏感,我该怎么办?取决于您的数据库,但是。。。我通常会说,您可以使用来实现这一点,但我认为应该确保了解数据库实现的保证(例如,什么样的写和读操作是原子的) 如果有什么帮助的话,似乎有关于事务的问题。一般来说,NoSQL解决方案比关系数据库具有更轻的事务语义,但在某种程度上仍然具有原子操作的功能 一般来说,主复制提供的一致性更少,可用性更高。因此,我们应该为正确的问题选择正确的工具 许多提供单文档(或行等)级别的事务。例

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

取决于您的数据库,但是。。。我通常会说,您可以使用来实现这一点,但我认为应该确保了解数据库实现的保证(例如,什么样的写和读操作是原子的)


如果有什么帮助的话,似乎有关于事务的问题。

一般来说,NoSQL解决方案比关系数据库具有更轻的事务语义,但在某种程度上仍然具有原子操作的功能

一般来说,主复制提供的一致性更少,可用性更高。因此,我们应该为正确的问题选择正确的工具


许多提供单文档(或行等)级别的事务。例如,在MongoDB中,单个文档具有原子性,但文档可能相当丰富,因此通常工作得很好。更多信息。

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

CREATE TABLE MY_KEY_VALUE_DATA
(
    id_content INTEGER PRIMARY KEY,
    b_content  BLOB
);
额外的好处是,您可以在这里添加额外的字段,将内容链接到其他适当的关系表中,同时仍将大量内容保留在主BLOB(或文本,如果是apt)字段中


就我个人而言,我倾向于使用文本表示,这样您就不必拘泥于处理数据的语言,例如,使用序列化Java意味着您可以从Perl访问内容以进行报告。文本也更容易调试,通常作为开发人员使用。

这是我找到的最接近任何NoSQL数据库的答案。Heroku.com的Adam Wiggins在2007年的一篇博文中写道:

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

发件人:(他的网站非常适合提供可扩展性方面的想法。)

我将上述段落解释为:

  • 为成员帐户创建数据库
  • 创建消息传递队列。给它起个绰号叫“账本”
  • 添加后台工作人员以完成队列中的每个请求
  • 更多信息。关于队列/后台工作人员:

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

  • 提交提款请求
  • 请求被发送到服务器
  • 服务器将其放入队列中。信息是:“拿出5000美元。”
  • 客户端显示:“请求正在完成,请稍候…”
  • 客户机每2秒轮询一次服务器,询问“请求是否已完成?”
  • 在服务器上,后台工作人员以先进先出的方式满足其他成员先前的请求。最终,他们会按照客户的要求取出钱
  • 完成请求后,客户机将收到一条消息,其中包含他们的新余额
  • 如果您对Node.js或Ruby/Rack感到满意,您可以使用Heroku.com快速创建一个小型模型

    总体思路似乎非常简单,而且比使用烘焙到数据库中的事务要好得多,因为事务使其很难扩展


    免责声明:我还没有以任何方式实现这一点。我读这些东西是出于好奇,尽管我对它们没有实际需要。是的,@gbn是正确的,带有事务的RDBMS可能足以满足Timmy和我的需要。尽管如此,通过开源工具和一个名为“.”的how-to网站,看看NoSQL数据库能走多远将是一件很有趣的事情。

    只是想在这个线程上对货币交易建议发表评论。交易是你真正想用于资金转移的东西

    举的例子是如何做的转让是非常好和整洁

    但在现实生活中,转账可能包括向其他账户支付费用或款项。人们使用来自另一个帐户的某些卡可以获得奖金,或者他们可以从他们的帐户中获得费用,并将其转移到同一系统中的另一个帐户。费用或付款可能因金融交易而异,您可能需要保持簿记系统,以显示每笔交易的贷方和借方

    这意味着您要同时更新多行,因为一个帐户上的贷方可以是一个或多个帐户上的借方。首先锁定行,以便在更新之前不能更改任何内容,然后确保写入的数据与事务一致

    这就是为什么您真正想要使用事务。如果写入一行时出现任何错误,您可以回滚所有更新,而不会导致财务事务数据不一致

    一次交易和两次操作(例如一次支付5000美元,第二次接收5000美元)的问题在于,您有两个具有相同优先级的帐户。您不能使用一个帐户来确认第二个帐户(或按相反顺序)。在这种情况下,您可以保证只有一个帐户是正确的(即已确认),第二个帐户(即已确认)可能已失败。让我们看看它失败的原因(使用消息aproach,发送方由接收方确认):

  • 将+5000美元写入接收方账户
  • 如果成功-将-5000美元写入发件人帐户
  • 如果失败-重试或取消或显示消息
  • 这将节省1英镑。但如果#2失败了,谁来担保呢?反向顺序也一样。

    但是,在没有事务和NoSQL的情况下,实现安全是可能的。始终允许您使用将被确认的第三个实体