ACID 和数据库事务如何工作?
Posted
技术标签:
【中文标题】ACID 和数据库事务如何工作?【英文标题】:How do ACID and database transactions work? 【发布时间】:2011-04-14 00:10:36 【问题描述】:ACID和数据库事务有什么关系?
ACID 是给数据库事务还是同样的东西?
谁能启发这个话题。
【问题讨论】:
【参考方案1】:ACID 是一组您希望在修改数据库时应用的属性。
原子性 一致性 隔离 耐用性事务是一组相关的更改,用于实现某些 ACID 属性。事务是实现 ACID 属性的工具。
原子性意味着您可以保证所有事务都发生,或者不发生;您可以将复杂的操作作为一个单独的单元进行,全有或全无,并且崩溃、电源故障、错误或其他任何事情都不会让您处于仅发生某些相关更改的状态。
一致性意味着您保证您的数据将是一致的;您对相关数据的任何限制都不会被违反。
隔离意味着一个事务不能从另一个尚未完成的事务中读取数据。如果两个事务同时执行,每个事务都将看到世界好像它们是按顺序执行的一样,如果一个事务需要读取另一个事务写入的数据,则必须等待另一个事务完成。
持久性是指一旦事务完成,保证所有的更改都记录在持久介质(如硬盘)中,事务完成的事实同样被记录下来。
因此,交易是保证这些属性的一种机制;它们是一种将相关操作组合在一起的方式,因此作为一个整体,一组操作可以是原子的、产生一致的结果、与其他操作隔离并被持久记录。
【讨论】:
您说“一致性意味着您保证您的数据将是一致的;您对相关数据的任何约束都不会被违反。”如果通过约束,您是指在数据库中定义的那些(例如,检查约束),那么事务管理与防止它们被违反有什么关系?它们不是一直有效吗?在我看来,ACID 中的 C 必须有另一个含义。 @MarcRochkind 事务允许您应用一致性检查,即使事务中的个别操作会违反一致性约束。例如,如果您要更新复式记账系统,您可能需要从多个帐户借记并同时贷记到多个帐户。如果没有事务,您将在每个语句之后检查约束,并且会因为各个语句不保持一致性而失败。对于事务,虽然单个语句不能保持一致性,但整个事务可以。 “如果一个人需要读取另一个人写入的数据,则必须等到另一个人完成”——这并不完全正确。第一个事务可以(并且将)读取该数据,并将看到第二个事务开始之前的状态。 @BrianCampbell 1) 一致性既是“检查约束”,如 UNIQUE、FOREIGN KEY 以及事务结束时的有效状态(根据应用程序的业务逻辑/要求)? 2)原子性和/或隔离本身不能确保一致性吗?我们是否应该明确提及一致性作为必需属性? @a_horse_with_no_name 你在谈论 OCC(乐观并发控制)v/s PCC(悲观)。两者都可以在符合 ACID 的数据库系统中实现,这取决于您是追求一致性还是高可用性。【参考方案2】:ACID 是任何事务处理引擎的理想属性。
DBMS 是(如果有好处的话)一种特殊类型的事务处理引擎,通常在很大程度上但不完全公开这些属性。
但存在其他引擎也可以公开这些属性。过去被称为“TP 监视器”的软件就是一个很好的例子(现在的等价物主要是 Web 服务器)。
此类 TP 监视器可以访问 DBMS 以外的资源(例如打印机),并且仍向其用户保证 ACID。例如,当打印机参与事务时,ACID 可能意味着什么:
原子性:打印整个文档或什么都不打印 一致性:在事务结束时,进纸位于页面顶部 隔离:打印时不会混淆两个文档 耐用性:打印机可以保证它不会“打印”空墨盒。【讨论】:
简洁的打印机示例。 很好的例子。我不明白“一致性”部分。在我看来,一个更好的例子是“打印机不接受大于 10 英寸的纸张。” 编辑 - “纸张宽度超过 10 英寸。” 我承认这有点牵强。但是很难找到更好的例子,因为“一致性”是关于数据的,而打印机并不完全是数据设备。 那么打印机有一个功能,如果文档的页数高于当前已知的纸张供应中的页数,打印机就会阻止它开始打印。你看这就是许多在这里发表评论的人的麻烦。你提到“打印机”,他们只看到他们家里办公桌上的那种愚蠢的串行流媒体设备,而不是会填满整个客厅的高级专业设备(而且通常具有我提到的那种功能)。 【参考方案3】:ACID和数据库事务有什么关系?
在关系数据库中,每条 SQL 语句都必须在事务范围内执行。
如果不明确定义事务边界,数据库将使用隐式事务,该事务包含每个单独的语句。
隐式事务在语句执行之前开始,在语句执行之后结束(提交或回滚)。 隐式事务模式通常称为自动提交。
事务是读/写操作的集合,只有当所有包含的操作都成功时才会成功。
一个事务本质上具有四个属性(通常称为 ACID):
原子性 一致性 隔离 耐用性ACID 是给数据库事务还是同样的东西?
对于关系数据库系统,这是正确的,因为 SQL 标准规定事务应提供 ACID 保证:
原子性
原子性将单个操作变成一个全有或全无的工作单元,当且仅当所有包含的操作都成功时才会成功。
事务可能封装状态更改(除非它是只读的)。无论在任何给定时间交错多少并发事务,事务都必须始终使系统保持一致状态。
一致性
一致性意味着对每个提交的事务都强制执行约束。这意味着所有的 Keys、Data types、Checks 和 Trigger 都是成功的,并且没有触发约束冲突。
隔离
事务需要并发控制机制,即使在交错时也能保证正确性。隔离给我们带来了对外部世界隐藏未提交状态更改的好处,因为失败的事务不应该破坏系统的状态。隔离是通过使用悲观或乐观锁定机制的并发控制来实现的。
耐用性
一个成功的事务必须永久地改变一个系统的状态,并且在结束它之前,状态改变被记录在一个持久化的事务日志中。如果我们的系统突然受到系统崩溃或断电的影响,那么所有未完成的已提交事务都可能被重放。
【讨论】:
对于“一致性”——我在很多地方都看到了“应用程序特定的逻辑正确性”作为解释。假设如果是这种情况,DB 无法知道应用程序逻辑。所以“一致性”不能是数据库的固有属性。那么,让应用程序实现其正确性(或“一致性”)还不够原子性和隔离性吗? 让我看看。但在此之前,我需要做一个基本的澄清。 Brain Campbell 在接受的答案中的评论“对于事务,虽然个别语句不能保持一致性,但整个事务可以”。这怎么可能 ?多重借方和贷方与一致性有何关系?【参考方案4】:我稍微修改了打印机示例,使其更易于解释
1 个包含 2 页内容的文档已发送到打印机
事务 - 文档发送到打印机
原子性 - 打印机打印文档的 2 页或不打印 一致性 - 打印机打印半页并且页面卡住。打印机重新启动并打印包含所有内容的 2 页 隔离 - 虽然正在进行的打印输出过多 - 打印机打印文档的正确内容 耐用性 - 打印时,有一种力量 cut-printer 再次打印文档而没有任何错误希望这有助于某人掌握 ACID 的概念
【讨论】:
我不确定“虽然有 太多 正在打印输出”是什么意思 - 它只是“多个”而不是“太多”?【参考方案5】:ACID 属性是数据库理论中非常古老且重要的概念。我知道你可以找到很多关于这个主题的帖子,但我仍然想开始分享这个问题的答案,因为这是 RDBMS 非常重要的主题。
数据库系统处理许多不同类型的事务,其中所有事务都有一定的特征。该特性称为 ACID 特性。 ACID 属性接受所有数据库事务以完成所有任务。
原子性:要么全部提交,要么什么都不提交。
一致性:在验证交易的所有规则和约束方面做出一致的记录。
隔离:确保两个事务彼此不知道。
持久性:提交的数据永久存储。 Reference taken from this article:
【讨论】:
【参考方案6】:引用Wikipedia:
ACID(原子性、一致性、隔离性、持久性)是一组保证数据库事务得到可靠处理的属性。
支持事务的 DBMS 将努力支持所有这些属性 - 任何商业 DBMS(以及几个开源 DBMS)都提供完整的 ACID“支持” - 尽管这通常是可能的(例如,在不同的隔离级别MSSQL) 来减少 ACIDness - 从而失去完全事务行为的保证。
【讨论】:
【参考方案7】:[Gray] 在 1981 年为交易引入了 ACD 属性。1983 年,[Haerder] 添加了 Isolation 属性。在我看来,ACD 属性将有一组更有用的属性可供讨论。原子性的一种解释(事务在任何时候都应该是原子的)实际上暗示了隔离属性。当事务不被隔离时,“隔离”属性很有用;当隔离属性放松时。在 ANSI SQL 中:如果隔离级别较弱,则 SERIALIZABLE。但是当隔离级别是 SERIALIZABLE 时,隔离属性就不是很重要了。
我在一篇博文中写了更多关于此的内容:“ACID 没有意义”。
http://blog.franslundberg.com/2013/12/acid-does-not-make-sense.html
[Gray] 交易概念,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
【讨论】:
【参考方案8】:数据库中的 ACID 属性:
原子性 : 交易要么全有,要么全无 一致性:只保存有效数据(数据库从一个一致的状态到另一个一致的状态。) 隔离:事务不相互影响(多个事务可以在系统中同时运行。并行执行多个事务必须与顺序运行具有相同的结果。 ) 持久性:写入的数据不会丢失(即使数据库立即崩溃或断电。)Credit【讨论】:
【参考方案9】:事务可以定义为被视为最小处理单元的任务集合。每个最小处理单元不能再进一步划分。
所有事务必须包含四个通常称为 ACID 属性的属性。即 ACID 是任何事务的一组属性。
原子性: 一致性 隔离 耐用性【讨论】:
以上是关于ACID 和数据库事务如何工作?的主要内容,如果未能解决你的问题,请参考以下文章