数据库的ACID

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。sql

所谓事务,它是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单位。数据库

目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
 
准备工做:为了说明事务的ACID原理,咱们使用银行帐户及资金管理的案例进行分析。
[sql]
//create table
create table Account
(
  Id int primary key not null,
      Name nvarchar(50) not null,
      Balance double
  
);
//有两我的开户并存钱
insert into Account values(1,'A',1000);
insert into Account values(2,'B',1000);
 
1、原子性
原子性是指事务是一个不可再分割的工做单位,事务中的操做要么都发生,要么都不发生。
1.案例

              AB转账100元钱安全

[sql]服务器

begin transaction  多线程

      update account set money= money - 100where name='A';  并发

      update account set money= money +100where name='B';  性能

if Error then  spa

      rollback  .net

else  线程

      commit 

在事务中的扣款和加款两条语句,要么都执行,要么就都不执行。不然若是只执行了扣款语句,就提交了,此时若是忽然断电,A帐号已经发生了扣款,B帐号却没收到加款,这样就出问题了。

解决办法:

在数据库管理系统(DBMS)中,默认状况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。保障事务的原子性是数据库管理系统的责任,为此许多数据源采用日志机制。例如,SQL Server使用一个预写事务日志,在将数据提交到实际数据页面前,先写在事务日志上。

 

2、一致性

一致性是指在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。

1 案例

 对银行转账事务,无论事务成功仍是失败,应该保证事务结束后ACCOUNT表中AB的存款总额为2000元。

解决办法:

保障事务的一致性,能够从如下两个层面入手

       2.1数据库机制层面

       数据库层面的一致性是,在一个事务执行以前和以后,数据会符合你设置的约束(惟一约束,外键约束,Check约束等)和触发器设置。这一点是由SQL SERVER进行保证的。好比转帐,则可使用CHECK约束两个帐户之和等于2000来达到一致性目的

       2.2业务层面

   对于业务层面来讲,一致性是保持业务的一致性。这个业务一致性须要由开发人员进行保证。固然,不少业务方面的一致性,也能够经过转移到数据库机制层面进行保证。

 

3、隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不该该影响其它事务运行效果。

这指的是在并发环境中,当不一样的事务同时操纵相同的数据时,每一个事务都有各自的完整数据空间。由并发事务所作的修改必须与任何其余并发事务所作的修改隔离。事务查看数据更新时,数据所处的状态要么是另外一事务修改它以前的状态,要么是另外一事务修改它以后的状态,事务不会查看到中间状态的数据。

隔离状态执行事务,使它们好像是系统在给定时间内执行的惟一操做。若是有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。

 

企业开发中,事务最复杂问题都是由事务隔离性引发的。当多个事务并发时,SQL Server利用加锁和阻塞来保证事务之间不一样等级的隔离性。通常状况下,彻底的隔离性是不现实的,彻底的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。想要理解SQL Server中对于隔离性的保障,首先要了解并发事务之间是如何干扰的.

       1.事务之间的相互影响

       事务之间的相互影响分为几种,分别为:脏读,不可重复读,幻读,丢失更新

   1.1脏读

       脏读意味着一个事务读取了另外一个事务未提交的数据,而这个数据是有可能回滚的;以下案例,此时若是事务1回滚,则B帐户必将有损失。

                                                                 

 

  1.2不可重复读

      不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不一样数据。这是因为查询时系统中其余事务修改的提交而引发的。以下案例,事务1必然会变得糊涂,不知道发生了什么。

                                                       

  

  1.3幻读(虚读)

    幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,之后就会发生操做第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉同样.

                                                      

 

  1.4丢失更新

       两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

 

  2.理解SQL SERVER中的隔离级别

       数据库的事务隔离级别(TRANSACTION ISOLATION LEVEL)是一个数据库上很基本的一个概念。为何会有事务隔离级别,SQL Server上实现了哪些事务隔离级别?事务隔离级别的前提是一个多用户、多进程、多线程的并发系统,在这个系统中为了保证数据的一致性和完整性,咱们引入了事务隔离级别这个概念,对一个单用户、单线程的应用来讲则不存在这个问题。

 

    为了不上述几种事务之间的影响,SQL Server经过设置不一样的隔离级别来进行不一样程度的避免。由于高的隔离等级意味着更多的锁,从而牺牲性能。因此这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离级别Read Commited符合了多数的实际需求.

 

 

 

隔离级别

脏读

丢失更新

不可重复读

幻读

并发模型

更新冲突检测

未提交读:Read  Uncommited

悲观

已提交读:Read  commited

悲观

可重复读:Repeatable  Read

悲观

可串行读:Serializable

悲观

 

       SQL Server隔离事务之间的影响是经过锁来实现的,经过阻塞来阻止上述影响。不一样的隔离级别是经过加不一样的锁,形成阻塞来实现的,因此会以付出性能做为代价;安全级别越高,处理效率越低;安全级别越低,效率越高。

 

       使用方法:SET TRANSACTIONISOLATION LEVEL REPEATABLE READ

 

       未提交读: 在读数据时不会检查或使用任何锁。所以,在这种隔离级别中可能读取到没有提交的数据。  

 

       已提交读:只读取提交的数据并等待其余事务释放排他锁。读数据的共享锁在读操做完成后当即释放。已提交读是SQL Server的默认隔离级别。 

 

       可重复读: 像已提交读级别那样读数据,但会保持共享锁直到事务结束。  

 

       可串行读:工做方式相似于可重复读。但它不只会锁定受影响的数据,还会锁定这个范围。这就阻止了新数据插入查询所涉及的范围。

 

4、持久性

   持久性,意味着在事务完成之后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

       即便出现了任何事故好比断电等,事务一旦提交,则持久化保存在数据库中。

 

       SQL SERVER经过write-ahead transaction log来保证持久性。write-ahead transaction log的意思是,事务中对数据库的改变在写入到数据库以前,首先写入到事务日志中。而事务日志是按照顺序排号的(LSN)。当数据库崩溃或者服务器断点时,重启动SQL SERVERSQLSERVER首先会检查日志顺序号,将本应对数据库作更改而未作的部分持久化到数据库,从而保证了持久性。

 

总结:

  事务的(ACID)特性是由关系数据库管理系统(RDBMS)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,若是某个事务在执行过程当中发生错误,就能够根据日志,撤销事务对数据库已作的更新,使数据库退回到执行事务前的初始状态。

  数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只容许持有锁的事务能更新该数据,其余事务必须等待,直到前一个事务释放了锁,其余事务才有机会更新该数据。

 

 

转载:http://blog.csdn.net/shuaihj/article/details/14163713

相关文章
相关标签/搜索