ACID和数据库事务是如何工作的?

184

ACID和数据库事务之间有什么关系?

ACID是给予数据库事务的,它并不是同一件事情。

能否有人阐明这个话题。

10个回答

350

ACID是在修改数据库时希望应用的一组属性。

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务是一组相关的更改,用于实现ACID属性。事务是实现ACID属性的工具。

原子性意味着您可以保证整个事务发生或全部不发生;您可以将复杂操作作为一个单独的单位进行,要么全部执行成功,要么完全不执行,同时崩溃、断电、错误或任何其他情况都不会导致只有部分相关更改已经发生。

一致性意味着您保证数据始终是一致的;您对相关数据的所有限制条件都不会违反。

隔离性意味着一个事务不能读取另一个未完成的事务中的数据。如果两个事务同时执行,每个事务将看到它们按顺序执行,如果一个需要读取另一个写入的数据,它必须等待另一个事务完成。

持久性意味着一旦事务完成,就保证记录了所有更改内容到持久性介质(如硬盘),同时记录了事务已经完成的事实。

因此,事务是保证这些属性的机制;它们是一种将相关操作分组在一起的方式,以使作为整体,一组操作可以是原子的、产生一致的结果、与其他操作隔离,并持久地记录下来。


8
如果您所说的“约束条件”是指数据库中定义的约束条件(例如检查约束条件),那么事务管理与防止这些条件被违反有什么关系呢?它们不是一直生效吗?在ACID中,C似乎必须有另外的含义。 "Consistency" 的含义是保证数据一致性,即相关数据上的所有约束条件都不会被违反。 - Marc Rochkind
23
一项事务能够让你在事务内部的单个操作违反一致性约束时应用一致性检查。例如,如果你正在更新双录簿记系统,可能需要同时从多个账户借方和多个账户贷方。如果没有事务,你需要在每个语句之后检查约束条件,但由于各个语句不保持一致性,因此会失败。有了事务,虽然单个语句不保持一致性,但整个事务可以保持一致性。 - Brian Campbell
@BrianCampbell,在阅读了你回答的最后一段和维基百科的第一段之后,我发现维基百科的观点与你的完全相反,即ACID属性保证了可靠的事务,而不是相反。 - KNU
1
如果需要读取其他人写入的数据,则必须等待其完成”这种说法并不完全正确。第一个事务可以(而且将会)读取该数据,并且将看到它在第二个事务开始之前的状态。” - user330315
1
@BrianCampbell 1) 一致性既包括“检查约束”(如UNIQUE、FOREIGN KEY),也包括在事务结束时符合应用程序的业务逻辑/要求的有效状态? 2) 原子性和隔离性本身是否足以确保一致性?我们是否应该明确提到一致性作为必需的属性? - user104309
2
@a_horse_with_no_name,你在谈论 OCC(乐观并发控制)与 PCC(悲观并发控制)。两者都可以在符合ACID标准的数据库系统中实现,这取决于你是追求一致性还是高可用性。 - Siddhartha

44

ACID是任何事务处理引擎都需要具备的理想特性。

一个DBMS(如果它真的很好)是一种特定类型的事务处理引擎,通常在很大程度上暴露这些属性,但不完全如此。

但是,还存在其他可以展示这些属性的引擎。以“TP monitors”为例,这种软件可以访问除了DBMS之外的资源(例如打印机),并且仍然向用户保证ACID。举个涉及打印机的ACID可能意味着什么的例子:

  • Atomicity:要么整个文档被打印出来,要么什么也不会发生
  • Consistency:在事务结束时,进纸器位置位于页面顶部
  • Isolation:打印过程中不会混淆两个文档
  • Durability:打印机可以保证不会用空墨盒“打印”。

5
优秀简洁的打印机示例。 - Evgenia Karunus
2
好的例子。不过我不太理解“一致性”的部分。在我看来,一个更好的例子是“打印机不接受大于10英寸的纸张”。 - skeller88
"纸张宽度超过10英寸。" - skeller88
2
我承认这个例子有点牵强。但是很难找到更好的例子,因为“一致性”是关于数据的,而打印机并不完全是一个数据设备。 - Erwin Smout
文档开始打印,纸张用完 - 原子性失败。 - FKEinternet
1
那么,打印机有一个功能,如果文档的页数高于当前已知的纸张供应量,则防止其开始打印。你看,这就是许多在这里发表评论的人的问题。你提到“打印机”,他们只看到家庭桌子上那个愚蠢的串行流设备,而不是会填满整个客厅的高级专业设备(通常具有我提到的那种功能)。 - Erwin Smout

32

ACID和数据库事务有什么关系?

在关系型数据库中,每个SQL语句都必须在事务范围内执行。

如果没有明确定义事务边界,则数据库将使用隐式事务,该事务将包装在每个单独的语句周围。

隐式事务在语句执行之前开始,在语句执行后结束(提交或回滚)。 隐式事务模式通常称为自动提交。

事务是一组读/写操作,只有所有包含的操作成功才会成功。

Atomicity

一个事务本质上由四个属性(通常称为ACID)来描述:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

ACID是给数据库事务的吗?还是同一个东西?

对于关系型数据库系统而言,这是正确的,因为SQL标准指定了事务应提供ACID保证:

原子性

原子性将单个操作转化为一个全有或全无的工作单元,只有所有包含的操作都成功才会成功。

事务可能封装状态更改(除非它是只读的)。事务必须始终使系统处于一致状态,不管并发事务在任何给定时间交错多少次。

一致性

一致性意味着对于每个提交的事务都强制执行约束。这意味着所有键、数据类型、检查和触发器都成功,没有触发约束违规。

隔离性

事务需要并发控制机制,并且即使被交错处理时也保证正确性。 隔离性带来的好处是将未提交的状态更改隐藏在外部世界中,因为失败的事务不应该破坏系统的状态。 隔离通过使用悲观锁定或乐观锁定机制来实现。

耐久性

一个成功的事务必须永久地改变系统的状态,并在结束之前将状态更改记录在持久化的事务日志中。如果我们的系统突然受到系统崩溃或停电的影响,则所有未完成的已提交事务都可以重新播放。

关系型数据库如何工作


对于“一致性”-我在许多地方看到的解释是“应用特定的逻辑正确性”。如果是这种情况,数据库无法了解应用程序逻辑。因此,“一致性”不能成为数据库的固有属性。因此,对于应用程序实现其正确性(或“一致性”),原子性和隔离是否足够? - user104309
让我看一下。但在此之前,我需要一个基本的澄清。Brain Campbell在被接受的答案中的评论是“使用事务时,尽管单个语句不保持一致性,但整个事务确实如此”。这是怎么可能的?多个借方和贷方与一致性有什么关系? - user104309
@VladMihalcea:“一个成功的事务必须永久性地改变系统的状态。” 您能否进一步阐述这里的“成功”是什么意思? - Mehdi Charife
一次成功的交易会被提交,而失败的交易将会回滚。 - Vlad Mihalcea

26

我稍微修改了打印机示例,以便更容易理解

将有2页内容的1个文档发送到打印机

事务 - 将文档发送到打印机

  • 原子性 - 打印机打印完整的2页文档或不打印
  • 一致性 - 打印机打印了半页然后卡住了。打印机重新启动并打印带有所有内容的2页文档
  • 隔离性 - 在进行太多打印时 - 打印机打印文档的正确内容
  • 持久性 - 在打印过程中停电 - 打印机再次打印文档而没有出现任何错误

希望这可以帮助某些人掌握ACID概念


我不确定 "while there were too many print outs in progress" 的意思 - 它只是指 "多个" 而不是 "太多"? - icc97

12

ACID属性是数据库理论中非常古老和重要的概念。我知道在这个话题上可以找到很多文章,但我仍然想开始分享对此的回答,因为这是RDBMS非常重要的主题。

数据库系统处理许多不同类型的事务,其中每个事务都具有某些特征。这种特征被称为ACID属性。 ACID属性确保所有数据库事务都能完成所有任务。

原子性:要么全部提交,要么全部回滚。

一致性:根据事务的所有规则和约束来验证并生成一致的记录。

隔离性:确保两个事务对彼此互不干扰。

持久性:提交的数据将永久存储。 引用自本文章:


6

引用维基百科的话:

ACID(原子性、一致性、隔离性、持久性)是一组属性,可确保可靠地处理数据库事务。

支持事务的DBMS将努力支持所有这些属性 - 任何商业DBMS(以及几个开源DBMS)都提供完整的ACID“支持” - 尽管通常可以通过降低ACID度数(例如,使用MSSQL中的不同隔离级别)来减少ACID度数,从而失去完全事务行为的保证。


4

数据库中的ACID属性:

  • 原子性事务要么全部完成,要么全部不完成
  • 一致性仅保存有效数据(从一个一致状态的数据库到另一个一致状态的数据库)
  • 隔离性事务互相不影响(多个事务可以在系统中同时运行。并行执行多个事务必须具有与串行运行它们相同的结果。)
  • 持久性写入的数据不会丢失(即使数据库立即崩溃或发生电源故障。)
    来源

3
< p > [Gray]在1981年引入了事务的ACD属性。 1983年,[Haerder]添加了隔离性(Isolation)属性。 在我看来,ACD属性将会有一个更有用的属性集来讨论。 原子性(Atomicity)的一个解释(从任何客户端任何时间上看,事务应该是原子性的)实际上就意味着隔离性(Isolation)属性。当事务不是孤立的时,“隔离”属性很有用,当隔离属性被放松时。按照ANSI SQL的说法:如果隔离级别比SERIALIZABLE要弱,但是当隔离级别是SERIALIZABLE时,隔离属性并不是真正感兴趣的内容。

我在博客文章中写得更多:“ACID没有意义”。

http://blog.franslundberg.com/2013/12/acid-does-not-make-sense.html

[Gray] The Transaction Concept,Jim Gray,1981年。 http://research.microsoft.com/en-us/um/people/gray/papers/theTransactionConcept.pdf

[Haerder] Principles of Transaction-Oriented Database Recovery,Haerder and Reuter,1983年。 http://www.stanford.edu/class/cs340v/papers/recovery.pdf


1

事务可以被定义为一组被视为最小处理单元的任务。每个最小处理单元无法再分割。

所有事务必须包含四个属性,通常被称为ACID属性。即ACID是任何事务的属性组。

  • 原子性:
  • 一致性
  • 隔离性
  • 持久性

0
这个问题是十年前提出的,从那时起,许多SQL和NoSQL解决方案已经被开发出来。不幸的是,ACID这个术语变成了更多的市场营销术语。虽然有些人可能声称只有“真正”的数据库才具备ACID,但它从来没有被设计成一个万能解决方案。
由于缺乏共识性定义,确定一个数据库是否兼容ACID可能会很具有挑战性。不同的数据库和系统对ACID的解释和实现方式也不尽相同。例如,一些数据库将可伸缩性置于一致性之上,并可能提供“最终一致性”,这与原始的ACID定义有所偏离。
总的来说,建议查看文档以了解数据库是否提供对ACID的某种支持,并决定它是否符合您的需求。此外,我强烈推荐阅读Martin Kleppmann的书《设计数据密集型应用》以获得更深入的理解和详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接