ACID 和数据库事务之间的关系是什么?
ACID 提供数据库事务还是同样的东西?
有没有人能告诉我。
引用 维基百科的话:
ACID (原子性、一致性、隔离性和持久性)是一组保证数据库事务得到可靠处理的属性。
支持事务的 DBMS 将努力支持所有这些属性——任何商业 DBMS (以及几个开源 DBMS)都提供完全的 ACID“支持”——尽管通常有可能(例如,在 MSSQL 中使用不同的隔离级别)减少 ACID ——从而失去完全事务行为的保证。
ACID 是一组您希望在修改数据库时应用的属性。
事务是一组相关的更改,用于实现某些 ACID 属性。事务是实现 ACID 属性的工具。
原子性意味着您可以保证发生所有事务,或者不发生任何事务; 您可以将复杂的操作作为一个单独的单元,全部或全部执行,并且崩溃、电源故障、错误或任何其他情况都不允许您处于只发生了一些相关更改的状态。
一致性意味着您要保证您的数据是一致的; 您对相关数据的任何约束都不会被违反。
隔离意味着一个事务无法从另一个尚未完成的事务中读取数据。如果两个事务同时执行,那么每个事务看起来都像是在按顺序执行,如果一个事务需要读取另一个事务写入的数据,那么它就必须等待另一个事务完成。
持久性意味着一旦事务完成,它保证所有的更改都被记录到持久性介质(例如硬盘)中,并且事务已经完成的事实也同样被记录。
因此,事务是保证这些属性的一种机制; 它们是将相关操作分组在一起的一种方式,这样作为一个整体,一组操作可以是原子的,可以产生一致的结果,可以与其他操作隔离,并可以持久地记录。
ACID 是任何事务处理引擎的理想属性。
DBMS 是一种特殊的事务处理引擎(如果它有任何优点的话) ,它通常在很大程度上公开这些属性,但并不完全公开。
但是存在其他引擎,也可以暴露这些属性。过去被称为“ TP 监视器”的软件就是一个很好的例子(现在的同类软件主要是网络服务器)。
这样的 TP 监视器可以访问 DBMS 以外的资源(例如打印机) ,并且仍然保证 ACID 对用户开放。例如,当打印机参与事务时,ACID 可能意味着什么:
[ Gray ]在1981年为一个交易引入了 ACD 属性。1983年[ Haerder ]增加了隔离属性。在我看来,ACD 属性有一组更有用的属性可以讨论。对 Atomicity 的一种解释(即事务应该是原子的,从任何客户机随时都可以看到)实际上暗示了隔离属性。当事务是 没有隔离的时候,当隔离属性被放松时,“隔离”属性非常有用。在 ANSI SQL 语句中: 如果隔离级别较弱,则使用 SERIALIZABLE。但是,当隔离级别为 SERIALIZABLE 时,隔离属性实际上并不重要。
我在一篇博客文章中写了更多关于这方面的内容: “ ACID 没有意义”。
Http://blog.franslundberg.com/2013/12/acid-does-not-make-sense.html
《交易概念》 ,吉姆 · 格雷,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
ACID 属性是数据库理论中一个非常古老而重要的概念。我知道您可以找到很多关于这个主题的文章,但是我仍然想开始分享这个问题的答案,因为这是关系数据库管理系统的一个非常重要的主题。
数据库系统涉及到许多不同类型的事务,所有的事务都具有一定的特征。这个特性是已知的 ACID 属性。 ACID 属性接受所有数据库事务的授权以完成所有任务。
原子性: 要么全部提交,要么什么都不提交。
一致性: 通过验证事务的所有规则和约束来创建一致的记录。
隔离: 确保两个事务彼此不知道。
持久性: 永久存储的已提交数据。 参考文献摘自本文:
事务可以定义为被视为最小处理单元的任务集合。每个最小处理单元不能进一步分割。
所有事务必须包含四个通常称为 ACID 属性的属性。即 ACID 是任何事务的属性组。
我稍微修改了一下打印机示例,使其更易于解释
1份文件,其中有2页的内容发送到打印机
事务 -发送到打印机的文件
希望这能帮助人们掌握酸的概念
在关系数据库中,每个 SQL 语句都必须在事务范围内执行。
在不显式定义事务边界的情况下,数据库将使用一个隐式事务,该事务包围每个单独的语句。
隐式事务在执行语句之前开始,在执行语句之后结束(提交或回滚)。 隐式事务模式通常称为自动提交。
事务是只有在所有包含的操作都成功时才继续执行的读/写操作的集合。
事务本质上有四个拥有属性(通常称为 ACID) :
对于关系数据库系统来说,这是正确的,因为 SQL 标准规定事务应该提供 ACID 保证:
原子性接受单个操作,并将它们转换为全有或全无的工作单元,当且仅当所有包含的操作都成功时才成功。
事务可能封装状态更改(除非它是只读的)。事务必须始终保持系统处于一致状态,无论在任何给定时间交错有多少并发事务。
一致性意味着对每个提交的事务强制约束。这意味着所有键、数据类型、检查和触发器都是成功的,没有触发约束冲突。
事务需要并发控制机制,即使在交错的情况下,它们也能保证正确性。隔离为我们带来了向外界隐藏未提交状态更改的好处,因为失败的事务永远不应该破坏系统的状态。隔离是通过使用悲观或乐观锁定机制的并发控制来实现的。
成功的事务必须永久地更改系统的状态,并且在结束该状态之前,状态更改将记录在持久事务日志中。如果我们的系统突然受到系统崩溃或断电的影响,那么所有未完成的已提交事务都可能被重播。
数据库中的 ACID 属性: