首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪些应用程序不需要ACID?

哪些应用程序不需要ACID?
EN

Stack Overflow用户
提问于 2011-04-26 02:15:05
回答 5查看 4.8K关注 0票数 14

对于这个愚蠢的问题,很抱歉,但是什么样的应用程序不需要符合ACID的数据库服务器呢?我有一个SQL Server背景,其中ACID一直“在那里”,现在研究其他DBMS使我开始思考。我能想到的几乎每个应用程序都想要原子性或隔离性。谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-26 02:19:27

任何基于NoSQL类型数据库的操作都是在牺牲ACID遵从性,以换取某些东西,通常是速度。

Twitter、Facebook、Reddit、Digg等。所有这些都是部分基于非酸的

票数 -1
EN

Stack Overflow用户

发布于 2011-10-24 09:40:39

其他答案似乎遗漏的是,普遍适用的ACID替代方案并不是“什么都不是”,它是一种称为eventual consistency (有时也称为BASE)的东西。

当人们说他们需要ACID语义时,通常他们真正的意思是,至少从领域/业务需求的角度来看,只是简单的数据完整性。他们希望确保数据不会丢失或损坏。许多NoSQL数据库仍然提供这种保证,它们只是以不同的方式和自己的条款提供而已。

如果您仅仅将NoSQL或基础数据库视为“非ACID数据库”,那么将其作为SQL或ACID数据库的不安全替代方案当然是有可能的。做出明智的决策意味着您了解必须在应用程序级别执行哪些操作,以弥补粗粒度事务的不足,并发挥EC的优势。一些常见的技术包括:

  • Optimistic concurrency,已经被用来最小化操作的事务性environment.
  • Idempotence中的锁定,这样如果一个长时间运行的操作在中途失败,它可以简单地一次又一次地重试,直到它使用compensating transactions的succeeds.
  • Long-running transaction技术为止,在分布式系统中,通常称为sagas,其中多个独立的事务由一些相关标识符分组,并且独立地跟踪整个操作的状态。通常,它们实际上对saga状态本身使用ACID语义,但这比两阶段提交要轻量级得多。

实际上,如果您花费大量时间在分布式系统上工作-即使是那些在每个单独的子系统上都具有ACID语义的系统-您会发现许多用于管理跨系统操作的相同技术,因为如果没有它们,您只会破坏性能(想想BizTalk和业务流程执行语言)。

一旦你有了一些使用它的经验,你就会意识到它实际上很有意义,而且通常比尝试应用ACID语义更容易。计算流程只是现实生活中流程的模型,现实生活中的流程有时会在中途失败。你订了机票,却突然不能再去了。你的工作是什么?你取消了。也许你拿回了你的钱,也许你没有,或者可能是介于两者之间的东西--这些都是你的业务规则。或者你开始预订,但是分心了,或者分心了,或者你的电源用完了,现在你的会话超时了。你的工作是什么?很简单,你可以重新开始。

为了真正正面回答这个问题,我会这样回答:

在以下情况下,您需要ACID语义:

  • 您可以合理地期望多个用户或进程同时处理同一数据。
  • 事务出现的顺序非常复杂,important;
  • You不能容忍向用户显示陈旧的数据。
  • 未完成的事务会产生显著的和/或直接的成本(例如,在财务系统中,不平衡的合计可能具有严重的consequences).

另一方面,如果满足以下条件,则不需要ACID语义:

  • 用户只倾向于对他们自己的私有数据执行更新,或者根本不执行更新(只是append).
  • There不是隐式的(业务定义的)事务排序。例如,如果两个客户竞争库存的最后一件商品,那么谁真正得到它对您来说并不重要。
  • 用户往往一次在同一屏幕上停留几秒或几分钟,因此无论如何都会查看过时的数据(这实际上描述了大多数permanently.

用户能够简单地放弃未完成的交易;让他们暂时坐在数据库中或在某些情况下使用some并不会产生负面影响

归根结底,很少有应用程序真正需要ACID语义。然而,许多应用程序会在某个地方需要它们--通常是在像saga状态或消息队列这样的孤立空间中。

下一次设计新的应用程序或功能时,尝试考虑是否可以将原子/隔离的“事务”建模为异步“事件链”,并使用一些额外的状态将它们联系在一起。在某些情况下,答案是否定的,但你可能会惊讶于答案是肯定的。

票数 22
EN

Stack Overflow用户

发布于 2011-10-10 12:33:50

这是一个悖论,每个关系型数据库管理系统的人都认为没有ACID的话天就会塌下来,但大多数NoSQL的人都很高兴地部署和支持最终用户应用程序,从来没有想过“我的应用程序如果有ACID会更好”。与Marc B的答案相反,NoSQL数据库不是更新随机丢失或数据随机损坏的数据库。关键的区别在于,在NoSQL数据库中,您可以使用原子性和隔离性等的有限版本,但要实现任意复杂性的事务,则需要付出指数级的努力。

没有理由不能使用非ACID数据库实现银行系统。大多数NoSQL数据库允许您使用微交易,即从一个帐户中扣除资金并将其添加到另一个帐户中,系统中的总金额发生变化的可能性为0。

为了在真实世界的例子中讨论这个问题,我将描述我们的应用程序。我的公司向高中出售软件,主要用于排课,但也包括点名、管理教师缺课/补课、短途旅行和房间预订。我们的软件基于内部开发的非ACID数据库引擎Mrjb (仅在内部可用),该引擎具有典型的NoSQL数据库的局限性。

与最终用户相关的ACID和NoSQL之间的差异的一个例子是,如果两个用户尝试在完全相同的时间标记同一卷,则最终结果将是两个用户提交的数据组合的可能性很小。ACID数据库将保证最终结果是一个用户的数据或另一个用户的数据,或者可能是一个用户的更新失败并向用户返回一条错误消息。

在这种情况下,我认为我们的用户不会关心单个学生的“缺勤”状态是否都与一个用户的更新一致,或者是两者的混合更新,尽管他们会关心我们分配的缺勤状态是否与两个用户的输入相反。这个例子在实践中不应该出现,如果它发生了,那么它就是一个“竞争条件”,基本上没有关于我们相信哪个用户的正确答案。

提出了一个与我们的Mrjb数据库有关的问题,即我们是否能够实现约束,如“在没有相应的Family对象的情况下,不得允许学生对象存在”。(“ACID”中的“C”=一致性)。事实上,我们可以而且确实保持了这种约束-微事务的另一个例子。

另一个例子是,当上传新版本的周期性课程表(通常是两周周期)时,每天的课程表都是以此为基础的。我们很难让这个更新事务原子化,或者允许其他事务从这个更新中独立执行。因此,我们基本上有一个选择,要么在这个主要事务发生时“停止世界”,这需要大约2秒,要么允许学生打印包含更新前和更新后数据的时间表(可能有一个100ms的窗口)。"stop The world“选项可能是更好的选项,但实际上我们使用的是后者。你可能会说,混合课程表比更新前的课程表更糟糕,但在这两种情况下,我们都需要依靠学校有一个流程来通知学生课程表已经改变-学生在过期的课程表上工作是一个大问题,即使是一致的课程表。另请注意,学生通常在网上查看他们的时间表,在这种情况下,问题会大大减少。

我还为http://brainresource.com编写了一个“基于文件系统的Blob数据库”,用于存储他们的大脑扫描结果。这是一个重要的数据库,也是一个没有ACID属性的数据库,尽管他们确实使用RDBMS来存储有关其主题的其他数据。

为了记录,我们的公司在这里被描述为:http://edval.com.au,我们的NoSql技术在这里被描述为(被描述为一种技术):http://www.edval.biz/memory-resident-programming-object-databases。有人担心这篇文章是垃圾邮件,给了我们公司一个插头,但我认为(a)提出的问题不能仅仅从理论上回答--你需要一些现实世界的例子,以及(b)隐瞒任何关于产品或数据库技术的识别信息是不合适的。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5781542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档