ACID和数据库事务之间有什么关系?
ACID是否提供数据库事务还是同样的事情?
有人可以启发这个话题。
答案 0 :(得分:290)
ACID是您在修改数据库时要应用的一组属性。
事务是一组相关的更改,用于实现某些ACID属性。事务是实现ACID属性的工具。
原子性意味着您可以保证所有交易都发生,或者没有任何交易发生;你可以将复杂的操作作为一个单独的单元进行,全部或全部,崩溃,电源故障,错误或其他任何东西都不允许你处于只发生一些相关变化的状态。
一致性意味着您保证您的数据一致;不会违反您对相关数据的任何约束。
隔离意味着一个事务无法从另一个尚未完成的事务中读取数据。如果两个事务同时执行,每个事务都会看到世界好像是按顺序执行,如果需要读取另一个事务所写的数据,则必须等到另一个事务完成。
持久性意味着一旦事务完成,就可以保证所有更改都已记录到持久介质(例如硬盘)中,并且同样记录了事务已完成的事实。
因此,交易是保证这些财产的机制;它们是将相关行为分组在一起的一种方式,因此总的来说,一组操作可以是原子的,产生一致的结果,与其他操作隔离,并且可以持久记录。
答案 1 :(得分:33)
ACID是任何事务处理引擎的理想属性。
DBMS(如果有任何好处)是一种特定类型的事务处理引擎,通常在很大程度上但不完全暴露这些属性。
但是存在其他可以暴露这些属性的引擎。曾经被称为“TP监视器”的软件就是一个很好的例子(现在主要是Web服务器)。
这样的TP监视器可以访问除DBMS(例如打印机)之外的资源,并且仍然保证ACID对其用户。作为打印机参与交易时ACID可能意味着什么的一个例子:
答案 2 :(得分:15)
我略微修改了打印机示例以使其更易于解释
1个有2页内容的文件被发送到打印机
交易 - 发送到打印机的文档
希望这可以帮助某人掌握ACID的概念
答案 3 :(得分:11)
ACID属性是数据库理论非常古老而重要的概念。我知道你可以在这个主题上找到很多帖子,但我仍然希望就此开始分享答案,因为这是RDBMS的一个非常重要的主题。
数据库系统使用许多不同类型的交易,其中所有交易都具有某些特征。该特征是已知的ACID属性。 ACID属性需要所有数据库事务的被授予者才能完成所有任务。
原子性:提交全部或全部。
一致性:在验证所有规则和交易约束方面做出一致的记录。
隔离:确保两个事务彼此不知道。
持久性:永久存储已提交的数据。 Reference taken from this article:
答案 4 :(得分:9)
ACID和数据库事务之间有什么关系?
在关系数据库中,每个SQL语句都必须在事务范围内执行。
如果不明确定义事务边界,数据库将使用包含每个单独语句的隐式事务。
隐式事务在语句执行之前开始,在执行语句之后结束(提交或回滚)。 隐式事务模式通常称为autocommit。
如this article中所述,只有当所有包含的操作都成功时,事务才是读取/写入操作的集合。
本质上,交易的特征是有四个属性(通常称为ACID):
ACID是否提供数据库事务还是同样的事情?
对于关系数据库系统,这是正确的,因为SQL Standard指定事务应该提供ACID保证:
Atomicity采用单独的操作并将其转换为全有或全无的工作单元,当且仅当所有包含的操作都成功时才能成功。
事务可能会封装状态更改(除非它是只读状态更改)。无论在任何给定时间交错多少并发事务,事务必须始终使系统保持一致状态。
一致性意味着对每个已提交的事务强制执行约束。这意味着所有密钥,数据类型,检查和触发都是成功的,并且不会触发约束违规。
事务需要并发控制机制,即使在交错时也能保证正确性。隔离为我们带来了隐藏来自外部世界的未提交状态更改的好处,因为失败的事务不应该破坏系统的状态。通过使用悲观或乐观锁定机制的并发控制来实现隔离。
成功的事务必须永久更改系统的状态,在结束之前,状态更改将记录在持久的事务日志中。如果我们的系统突然受到系统崩溃或停电的影响,则可能会重播所有未完成的已提交事务。
有关持久性和重做日志的更多详细信息,请查看this article。
答案 5 :(得分:4)
引用Wikipedia:
ACID(原子性,一致性,隔离性,持久性)是一组保证数据库事务可靠处理的属性。
支持事务的DBMS将努力支持所有这些属性 - 任何商业DBMS(以及几个开源DBMS)都提供完整的ACID“支持” - 尽管它通常是可能的(例如,具有不同的隔离级别) MSSQL)减少ACIDness - 从而失去完全交易行为的保证。
答案 6 :(得分:2)
[Gray]在1981年介绍了交易的ACD属性。1983年[Haerder]添加了Isolation属性。在我看来,ACD属性将有一组更有用的属性来讨论。对原子性的一种解释(事务应该是任何时候从任何客户端看到的原子)实际上意味着隔离属性。当事务不隔离时,“隔离”属性很有用;当隔离属性放松时。在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
答案 7 :(得分:0)
可以将事务定义为被视为最小处理单元的任务集合。每个最小处理单元不能进一步划分。
所有事务必须包含四个通常称为ACID属性的属性。即ACID是任何交易的属性组。