在什么情况下支持交易并不重要?

时间:2012-01-04 16:09:53

标签: database transactions nosql rdbms

在发布问题here之后,我知道NoSQL更适合扩展,因为它们在支持事务和可伸缩性之间进行权衡。

所以我想知道在什么情况下交易不是那么重要,因此可扩展性更适合支持交易?

3 个答案:

答案 0 :(得分:2)

好吧,首先我会说NoSQL在扩展方面更好一些,但不是全部。

完整的ACID交易是原子的,一致的,孤立的和持久的。如果您丢失了交易,您将丢失数据存储区中的部分或全部ACID。

有很多方法可以使用其他异步系统恢复这些功能,例如消息队列本身是持久的。您可以将数据推送到持久的消息队列,弹出数据并在NoSQL中处理它,然后,当您确认它存储到您所需的最小值时,您可以将消息标记为已消耗。它是ACID中的D,但是分布式和异步。有办法确保其他人,但他们往往在某种程度上牺牲,或搬到系统的另一个地方。使用一些NoSQL解决方案,您只需将一致性移动到应用程序中,这样就不会尝试存储无效数据。

当您开始摆脱数据库驱动的事务时,必须大幅增加应用程序测试,以确保系统不会失败(对于某些失败值)。

在具有读写要求的系统中,基本上不存在事务和约束不重要的情况。如果他们不是你根本不关心你的数据(有些人不关心,但后来后悔)。然而,有“关怀”的水平。这只是你最终在ACID或一些“足够好”的伪ACID的问题。 RDMBS便宜地关注您的数据。 NoSQL使你的数据关心变得昂贵,但它使得扩展成本便宜(呃)(在某些情况下)。在RDBMS中有许多公司都有多TB的数据库,所以单方面说“它们不能扩展”只是不准确。然而,多TB的SQL数据库可能会花费很多钱,具体取决于用例(毕竟只需将带有几个3TB驱动器的RAID 10阵列打到计算机上并在其上抛出数据库引擎。可能需要几分钟时间几个小时就可以在一张大桌子上进行任何类型的表扫描,甚至是索引查找,但是如果你不在乎,那就便宜且多太太了。)

答案 1 :(得分:0)

最大的类别是只读类型查询,其中可以简单地重复中止或拙劣的事务。您正在更改基础状态或希望保证一次且仅保证一次活动的任何内容都应具有适当的事务语义。

也就是说,“我想订购一个小部件,向我的信用卡收费”应该是一个正确的交易:我不希望我的卡充电,除非订购小部件,并且供应商不希望小部件被发送除非该卡是收费的。 “报告订单xyz的发货状态”不需要是交易的 - 如果我没有得到答案,我可以点击重新加载。

答案 2 :(得分:0)

其中大部分只是侧面思考。 交易的全部内容是你完成了几个操作,并且如果任何失败都应该被取消,并且当事务正在进行时,记录被锁定,除非你已经读取了未提交的操作,否则你看不到任何操作在交易提交之前,各州的状态变化。

使用分布式系统完成所有这些工作非常昂贵,因为您需要一个“核心”且难以扩展的点,需要“了解”所有其他系统。

相反或订购此,请为我的卡充电,并告诉我当前的余额。

你试着订购这个,如果它是我的卡充电,如果我的卡充电,当前已知的余额将是这个。 存在风险,订单将被下达,付款失败,因此您需要处理。卡的建议余额存在风险,因此我不能完全准确,因此添加狡猾的词语并显示支付的潜在影响而不是结果。

交易并不重要,因为它们在NoSQL系统中得不到支持,在哪里/如何不使用它们。

相关问题