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


Answers:


320

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

  • 原子性
  • 一致性
  • 隔离
  • 耐用性

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

原子性意味着您可以保证所有交易都会发生,或者没有任何交易发生;您可以将一个或多个组件作为一个整体来进行复杂的操作,而崩溃,电源故障,错误或其他任何事情都不会使您处于仅发生某些相关更改的状态。

一致性意味着您保证数据将保持一致;您对相关数据的任何约束都不会被违反。

隔离意味着一个事务无法从另一个尚未完成的事务读取数据。如果两个事务正在同时执行,则每个事务都将看到世界,就像它们在依次执行一样;如果一个事务需要读取另一个事务写入的数据,则必须等到另一个事务完成为止。

持久性意味着一旦事务完成,就可以确保所有更改都已记录到持久介质(例如硬盘)中,并且同样记录了事务已完成的事实。

因此,交易是保证这些特性的一种机制。它们是将相关动作组合在一起的一种方式,这样,从整体上讲,一组操作可以是原子的,可以产生一致的结果,可以与其他操作隔离,并且可以进行持久记录。


6
您说:“一致性意味着您保证数据将是一致的;将永远不会违反对相关数据的任何约束。” 如果说约束是指数据库中定义的约束(例如检查约束),那么事务管理与防止违反约束有什么关系?他们不是一直有效吗?在我看来,ACID中的C必须具有其他含义。
马克·罗奇金德

20
@MarcRochkind事务使您可以应用一致性检查,即使该事务中的各个操作都会违反一致性约束。例如,如果您要更新复式簿记系统,则可能需要同时从多个帐户借记并贷记到多个帐户。没有事务,您将在每个语句之后检查约束,并且会失败,因为单个语句无法保持一致性。对于事务,尽管单个语句不能保持一致性,但整个事务还是可以。
布莱恩·坎贝尔

1
并且如果一个人需要读取由另一个人写入的数据,则必须等到另一个人完成之后 ”-并不完全正确。第一个事务可以(并且将)读取该数据,并且将看到第二个事务开始之前的状态。
a_horse_with_no_name 2015年

1
@BrianCampbell 1)一致性在事务结束时既是“检查约束”(例如UNIQUE,FOREIGN KEY)又是有效状态(根据应用程序的业务逻辑/要求)?2)原子性和/或隔离度不能单独确保一致性吗?我们是否应该明确提到一致性作为必需属性?
user104309 '16

1
@a_horse_with_no_name您在谈论OCC(乐观并发控制)与PCC(悲观)。两者都可以在符合ACID的数据库系统中实现,具体取决于您是否要保持一致性或高可用性。
Siddhartha

37

ACID是任何事务处理引擎的理想属性。

DBMS是(如果有好处的话)一种特殊的事务处理引擎,通常会在很大范围内(但不是完全)公开那些属性。

但是存在其他也可以公开这些属性的引擎。曾经被称为“ TP监视器”的软件就是一个典型的例子(如今,等效的软件主要是Web服务器)。

这样的TP监视器可以访问DBMS(例如打印机)以外的资源,并且仍然向其用户保证ACID。例如,当打印机参与交易时,ACID可能意味着什么:

  • 原子性:打印整个文档或什么都没有
  • 一致性:交易结束时,进纸位于页面顶部
  • 隔离度:打印时不会混淆两个文档
  • 耐用性:打印机可以保证未使用空墨盒进行“打印”。

3
简洁的打印机示例。
lakesare

2
好的例子。我不理解“一致性”部分。在我看来,一个更好的例子是“打印机不接受大于10英寸的纸张”。
skeller88

编辑-“纸张宽于10英寸”。
skeller88

1
我承认这有点牵强。但是很难找到更好的例子,因为“一致性”是关于数据的,而打印机也不是真正的数据设备。
Erwin Smout,2015年

1
那么,如果文档的页数大于当前已知在供纸器中的纸张数,则打印机具有一种可以阻止其开始打印的功能。您会发现很多人在这里发表评论就是麻烦所在。您提到“打印机”时,他们只会看到自己办公桌上有那种笨拙的串行流设备,而看不到会填满整个客厅的高档专业设备(并且通常具有我提到的那种功能)。
Erwin Smout

21

我稍加修改了打印机示例,使其更易于解释

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

交易 -文件已发送到打印机

  • 原子性 -打印机仅打印2页文档或不打印
  • 一致性 -打印机打印半页并且页面卡住。打印机自行重启并打印2页所有内容
  • 隔离 -在进行过多打印时-打印机打印文档的正确内容
  • 耐用性 -在打印时,有一个电源切断器-打印机再次打印文档而没有任何错误

希望这可以帮助某人摆脱ACID概念的束缚


我不确定“正在处理太多打印输出”是什么意思-它只是“多个”而不是“太多”?
icc97

17

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

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

在不显式定义事务边界的情况下,数据库将使用隐式事务,该隐式事务环绕每个单独的语句。

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

本文所述,事务是只有所有包含的操作都成功时,读/写操作才成功的集合。

原子性

交易固有具有四个属性(通常称为ACID):

  • 原子性
  • 一致性
  • 隔离
  • 耐用性

ACID提供数据库事务还是同一件事?

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

原子性

原子性接受单个操作并将其转变为一项全有或全无的工作单元,只有当所有包含的操作都成功时,该操作才成功。

事务可能会封装状态更改(除非它是只读的)。事务在任何给定时间都必须始终保持系统处于一致状态,无论有多少并发事务被交错。

一致性

一致性意味着对每个已提交的事务强制执行约束。这意味着所有键,数据类型,检查和触发器均成功,并且不会触发任何约束冲突。

隔离

事务需要并发控制机制,并且即使在被交错时,它们也可以确保正确性。隔离为我们带来了隐藏外界未提交的状态更改的好处,因为失败的事务永远都不会破坏系统的状态。通过使用悲观或乐观锁定机制的并发控制来实现隔离。

耐用性

成功的事务必须永久更改系统的状态,并且在结束系统之前,将状态更改记录在持久的事务日志中。如果我们的系统突然受到系统崩溃或断电的影响,那么所有未完成的已提交事务都可能会被重放。

在此处输入图片说明

有关耐久性和重做日志的更多详细信息,请参阅本文


对于“一致性”-我在许多地方都将“特定于应用程序的逻辑正确性”作为解释。假设是这种情况,DB无法知道应用程序逻辑。因此,“一致性”不能成为数据库的固有属性。因此,对于要实现其正确性(或“一致性”)的应用程序来说,原子度和隔离度还不够吗?
user104309

1
ACID中的一致性意味着数据库完整性约束:PK,FK,UNIQUE约束。ACID很重要,但您的应用程序可能需要的还不止这些,例如防止长时间对话中丢失更新,这需要应用程序级的乐观锁定。
Vlad Mihalcea

让我看一看。但在此之前,我需要基本澄清。Brain Campbell在接受的答案中的评论“对于交易,尽管个别陈述不能保持一致性,但整个交易都可以做到”。这怎么可能 ?以及多个借方和贷方与一致性如何相关?
user104309

请查阅我的《高性能Java持久性》一书中的“事务”一章,以获得所有这些问题的详细答案。
弗拉德·米哈尔恰

12

ACID属性是非常古老且重要的数据库理论概念。我知道您可以找到很多与此主题相关的帖子,但是我仍然想对此分享答案,因为这是RDBMS的非常重要的主题。

数据库系统处理许多不同类型的事务,其中所有事务都有一定的特征。此特性是已知的ACID属性。ACID属性使所有数据库事务的受让人都可以完成所有任务。

原子性:全部或全部不提交。

一致性:在验证所有规则和交易约束方面进行一致记录。

隔离:确保两个事务彼此之间不知道。

耐用性:永久存储提交的数据。 从本文引用:


5

引用维基百科

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

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


3

格雷[Gray]在1981年为交易引入了ACD属性​​。1983年[Haerder]添加了Isolation属性。我认为,ACD属性​​将具有一组更有用的属性来讨论。对原子性的一种解释(该事务应在任何时间从任何客户端看到都是原子的)实际上暗示着隔离属性。当隔离事务时,“隔离”属性很有用。当隔离属性放宽时。用ANSI SQL来说:如果隔离级别较弱,则可以SERIALIZABLE。但是,当隔离级别为SERIALIZABLE时,隔离属性并不是真正有意义的。

我在博客文章“ ACID没有意义”中写了更多有关此的内容。

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

[灰色]交易概念,吉姆·格雷(Jim Gray),1981年。http ://research.microsoft.com/en-us/um/people/gray/papers/theTransactionConcept.pdf

[Haerder]面向事务的数据库恢复原理,Haerder和Reuter,1983年 。http://www.stanford.edu/class/cs340v/papers/recovery.pdf


1

事务可以定义为被视为最小处理单位的任务集合。每个最小处理单元无法进一步划分。

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

  • 原子度:
  • 一致性
  • 隔离
  • 耐用性
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.