数据库事务的ACID(原⼦性,⼀致性,隔离性,持久性)四⼤
特性
我从翻译的。翻译⽔平有限:
在计算机科学中,ACID(原⼦性,⼀致性,隔离性,持久性)是数据库事务的⼀组属性,旨在即使在发⽣错误,断电等情况下也可以确保有效性。在数据库的上下⽂中,这是指⼀系列数据库操作,它们可以满⾜ACID属性(并且可以将这些属性视为对数据的单个逻辑操作)称为事务。例如,从⼀个银⾏帐户到另⼀个银⾏帐户的资⾦转移,即使涉及多个更改,例如从⼀个帐户借记⽽向另⼀个帐户贷记,也只是⼀次交易。
1983年, Andreas Reuter和TheoHärder在吉姆·格雷(Jim Gray)提出原⼦性,⼀致性和持久性的早期⼯作的基础上,加了个隔离性。将⾸字母缩写ACID称为原⼦性,⼀致性,隔离性和持久性的简写。
Reuter和Härder定义的这四个属性的特征如下:
原⼦性:
事务通常由多个语句组成。原⼦性保证将每个事务视为⼀个单独的“单元”,它要么完全成功,要么完全
失败:如果构成事务的任何语句未能完成,则整个事务都会失败,并且数据库将保持不变。原⼦系统必须保证在每种情况下的原⼦性,包括电源故障,错误和崩溃。原⼦性的保证可以防⽌仅部分更新数据库,这可能⽐直接拒绝整个事务的系列操作引起更⼤的问题。原⼦事务的⼀个⽰例是从银⾏帐户A到帐户B的货币转移。它包括两个操作,从帐户A取款并将其保存到帐户B。在原⼦事务中执⾏这些操作可确保数据库保留在⼀个⼀致的状态,也就是说,如果这两个操作中的任何⼀个失败,那么钱必须保证不会丢失也不会⽆端多出来。
⼀致性:
⼀致性确保事务只能将数据库从⼀种有效状态带到另⼀种状态,并保持数据库不变性:写⼊数据库的任何数据必须根据所有定义的规则(包括约束,级联,触发器及其任何组合)有效。这可以防⽌数据库因⾮法交易⽽损坏,但不能保证交易正确,因为数据通常是代码写⼊的,代码计算出错,写进去也是错的,所以⼀致性并不是⽤来保证交易正确。这个概念可以参照数据库的完整性保证了主键-外键关系,类似这种意思。
隔离性:
交易通常是同时执⾏的(例如,多个交易同时读取和写⼊⼀个表)。隔离确保并发执⾏事务使数据库保持与顺序执⾏事务时所获得的状态相同的状态。隔离是数据库设计开发中并发控制所要实现的⽬标。
根据所使⽤的⽅法(有隔离级别),未完成的事务甚⾄可能对其他事务是不可见。
持久性:
持久性保证了⼀旦事务被提交,即使在系统故障(例如,停电或崩溃)的情况下,事务也将保持提交。这通常意味着完成的事务(或其影响)被记录在⾮易失性存储器中。这个⽐较好理解。
下⾯是⼀个案例:
以下⽰例进⼀步说明了ACID属性。在这些⽰例中,数据库表具有两列,即A和B。完整性约束要求A中的值和B中的值之和必须为100。下⾯的SQL代码如上所述创建⼀个表:
CREATE TABLE acidtest (A INTEGER, B INTEGER, CHECK (A + B = 100));
然后具体问题具体分析:
原⼦性:原⼦性保证了原⼦事务中的⼀系列数据库操作要么全部发⽣(成功的操作),要么都不发⽣(不成功的操作)。⽆法仅执⾏其中⼀部分操作就将⼀系列操作分开,这使得该系列操作“不可分割”。原⼦性的保证可以防⽌仅部分更新数据库,这可能⽐直接拒绝整个事务⼀系列操作引起更⼤的问题。换句话说,原⼦性意味着不可分割性和不可还原性。或者,我们可以说逻辑事务可以由⼀个或多个物
理事务组成。除⾮执⾏了所有物理事务,否则逻辑事务不会发⽣对数据库的影响。假设我们的逻辑交易为将资⾦从帐户A转移到帐户B。此逻辑交易可能由⼏笔物理交易组成,这些交易包括⾸先从帐户A中删除这笔⾦额作为第⼀笔物理交易,然后作为第⼆笔物理交易将所述⾦额转⼊帐户B。然后,除⾮两次物理交易都发⽣且该⾦额已转移到帐户B中,否则转帐不会对数据库产⽣影响。
⼀致性:⼀致性是⼀个⾮常笼统的术语,它要求数据必须符合所有验证规则。在前⾯的⽰例中,验证是A + B = 100的要求。必须检查所有验证规则以确保⼀致性。假定事务尝试从A减去10⽽未更改B。由于在每次事务之后都会检查⼀致性,因此已知在事务开始之前A + B = 100。如果⼀个事务成功从A中删除10,将实现原⼦性。但是,验证检查将显⽰A + B = 90,这与数据库规则不⼀致,就会取消整个事务,并将受影响的⾏回滚到其事务前的状态。如果存在其他约束,触发器或级联,则在提交事务之前,将以与上述相同的⽅式检查每个更改操作。其他
约束条件可能会出现类似的问题。我们可能要求A和B的数据类型均为整数,例如,如果我们输⼊A的值13.5,则交易将被取消,或者系统可能以触发器的形式发出警报(如果/已将触发器写⼊此效果)。另⼀个例⼦是完整性约束,它不允许我们删除⼀个表中的⾏,该⾏的主键被其他表中的⾄少⼀个外键引⽤,这个时候也是违反了事务的⼀致性,因为破坏了验证规则。
隔离性:为了证明隔离,我们假设两个事务同时执⾏,每个事务都试图修改相同的数据。两者之⼀必须等到另⼀个完成才能保持隔离。考虑两个事务:T1从A到B转移10。T2从B到A转移20。
有四个动作:
(1)T1从A减去10。
(2)T1将B加10。
(3)T2从B减去20。
(4)T2将A加20。
如果按顺序执⾏这些操作,则尽管T2必须等待,但仍可保持隔离。考虑如果T1中途失败,会发⽣什么情况。该数据库消除了T1的影响,⽽T2还是会看到有效数据。数据库属性的概念
通过对事务进⾏交织,操作的实际顺序可能是:
(1)T1从A减去10。
(2)T2从B减去20。
(3)T2将A加20。
(4)T1将B加10。
考虑如果在步骤4中修改B时T1失败,相当于T1未提交,但是T2读了T1未提交的数据,会发⽣什么情况。如果不离开⽆效的数据库,则⽆法将其还原到T1之前的值。这被称为写-写失败,因为两个事务试图写⼊同⼀数据字段。在系统中,可以通过恢复到最后⼀个已知的良好状态,回滚失败的事务T1,并重新启动事务T2来解决问题。
持久性:考虑⼀个将10从A转移到B的事务。⾸先它从A删除10,然后将10加到B。这时,⽤户被告知该交易成功。但是,更改仍在磁盘缓冲区中排队,等待提交到磁盘。电源故障,更改丢失。但是只要事务提交就是有效的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论