ACID和数据库事务之间有什么关系?
ACID提供数据库事务还是同一件事?
有人可以启发这个话题。
ACID和数据库事务之间有什么关系?
ACID提供数据库事务还是同一件事?
有人可以启发这个话题。
Answers:
ACID是在修改数据库时要应用的一组属性。
事务是一组相关的更改,用于实现某些ACID属性。事务是实现ACID属性的工具。
原子性意味着您可以保证所有交易都会发生,或者没有任何交易发生;您可以将一个或多个组件作为一个整体来进行复杂的操作,而崩溃,电源故障,错误或其他任何事情都不会使您处于仅发生某些相关更改的状态。
一致性意味着您保证数据将保持一致;您对相关数据的任何约束都不会被违反。
隔离意味着一个事务无法从另一个尚未完成的事务读取数据。如果两个事务正在同时执行,则每个事务都将看到世界,就像它们在依次执行一样;如果一个事务需要读取另一个事务写入的数据,则必须等到另一个事务完成为止。
持久性意味着一旦事务完成,就可以确保所有更改都已记录到持久介质(例如硬盘)中,并且同样记录了事务已完成的事实。
因此,交易是保证这些特性的一种机制。它们是将相关动作组合在一起的一种方式,这样,从整体上讲,一组操作可以是原子的,可以产生一致的结果,可以与其他操作隔离,并且可以进行持久记录。
ACID是任何事务处理引擎的理想属性。
DBMS是(如果有好处的话)一种特殊的事务处理引擎,通常会在很大范围内(但不是完全)公开那些属性。
但是存在其他也可以公开这些属性的引擎。曾经被称为“ TP监视器”的软件就是一个典型的例子(如今,等效的软件主要是Web服务器)。
这样的TP监视器可以访问DBMS(例如打印机)以外的资源,并且仍然向其用户保证ACID。例如,当打印机参与交易时,ACID可能意味着什么:
我稍加修改了打印机示例,使其更易于解释
1个具有2页内容的文档已发送到打印机
交易 -文件已发送到打印机
希望这可以帮助某人摆脱ACID概念的束缚
ACID和数据库事务之间有什么关系?
在关系数据库中,每个SQL语句必须在事务范围内执行。
在不显式定义事务边界的情况下,数据库将使用隐式事务,该隐式事务环绕每个单独的语句。
隐式事务在语句执行之前开始,在语句执行之后结束(提交或回滚)。隐式事务模式通常称为自动提交。
如本文所述,事务是只有所有包含的操作都成功时,读/写操作才成功的集合。
交易固有具有四个属性(通常称为ACID):
ACID提供数据库事务还是同一件事?
对于关系数据库系统,这是正确的,因为SQL标准指定事务应提供ACID保证:
原子性接受单个操作并将其转变为一项全有或全无的工作单元,只有当所有包含的操作都成功时,该操作才成功。
事务可能会封装状态更改(除非它是只读的)。事务在任何给定时间都必须始终保持系统处于一致状态,无论有多少并发事务被交错。
一致性意味着对每个已提交的事务强制执行约束。这意味着所有键,数据类型,检查和触发器均成功,并且不会触发任何约束冲突。
事务需要并发控制机制,并且即使在被交错时,它们也可以确保正确性。隔离为我们带来了隐藏外界未提交的状态更改的好处,因为失败的事务永远都不会破坏系统的状态。通过使用悲观或乐观锁定机制的并发控制来实现隔离。
成功的事务必须永久更改系统的状态,并且在结束系统之前,将状态更改记录在持久的事务日志中。如果我们的系统突然受到系统崩溃或断电的影响,那么所有未完成的已提交事务都可能会被重放。
有关耐久性和重做日志的更多详细信息,请参阅本文。
格雷[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