`

事务的ACID理解

阅读更多

转自:http://www.cnblogs.com/malaikuangren/archive/2012/04/06/2434760.html

 

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.下面针对这几个特性进行逐个讲解.

理解原子性(Atomicity)

原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。

在SQL SERVER中,每一个单独的语句都可以看作是默认包含在一个事务之中:

所以,每一个语句本身具有原子性,要么全部执行,这么全部不执行,不会有中间状态:

 

上面说了,每一条T-SQL语句都可以看作是默认被包裹在一个事务之中的,SQL Server对于每一条单独的语句都实现了原子性,但这种原子粒度是非常小的,如果用户想要自己定义原子的大小,则需要包含在事务中来构成用户自定义的原子粒度:

 

对于用户来说,要用事务实现的自定义原子性往往是和业务相关的,比如银行转账,从A账户减去100,在B账户增加100,如果这两个语句不能保证原子性的话,比如从A账户减去100后,服务器断电,而在B账户中却没有增加100.虽然这种情况会让银行很开心,但作为开发人员的你可不希望这种结果.而默认事务中,即使出错了也不会整个事务进行回滚。而是失败的语句抛出异常,而正确的语句成功执行。这样会破坏原子性。所以SQL SERVER给予了一些选项来保证事务的原子性.

SQL SERVER提供了两大类方式来保证自定义事务的原子性:

1.通过SET XACT_ABORT ON来设置事务必须符合原子性

利用设置XACT_ABORT选项设置为ON,来设置所有事务都作为一个原子处理.下面例子利用两个语句插入到数据库,可以看到开启SET XACT_ABORT ON选项后,事务具有了原子性:

 

2.按照用户设置进行回滚(ROLLBACK)

这种方式具有更高的灵活性,开发人员可以自定义在什么情况进行ROLLBACK,利用TRY CATCH语句和@@ERROR进行判断都属于这种方式.

 

理解一致性(Consistency)

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

一致性分为两个层面

1.数据库机制层面

数据库层面的一致性是,在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置.这一点是由SQL SERVER进行保证的.

 

2.业务层面

对于业务层面来说,一致性是保持业务的一致性.这个业务一致性需要由开发人员进行保证.很多业务方面的一致性可以通过转移到数据库机制层面进行保证.比如,产品只有两个型号,则可以转移到使用CHECK约束使某一列必须只能存这两个型号.

 

理解隔离性(Isolation)

隔离性。事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

在Windows中,如果多个进程对同一个文件进行修改是不允许的,Windows通过这种方式来保证不同进程的隔离性

 

而SQL Server中,通过SQL SERVER对数据库文件进行管理,从而可以让多个进程可以同时访问数据库:

SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性.

一般情况下,完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样的性能可想而知.想要理解SQL Server中对于隔离性的保障,首先要了解事务之间是如何干扰的.

事务之间的互相影响的情况分为几种,分别为:脏读(Dirty Read),不可重复读,幻读

 

脏读

脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的,下面来看一个例子:

两个事务,事务A插入一条数据,但未提交,事务B在此期间进行了读取,读取到了事务A未提交的数据,造成脏读

 

不可重复读(Unrepeatable Read)

不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

下面来看一个不可重复读的例子:

事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变:

幻读(phantom read)

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

下面来看一个例子:

事务B更新表中所有的数据,在此期间事务A插入了一条数据,事务B再次查询后,发现居然还有没有修改的数据,产生幻读:

理解SQL SERVER中的隔离级别

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

SQL Server隔离事务之间的影响是通过锁来实现的,这个概念比较繁杂,所以本文不会详细对这个概念进行讲解.通过阻塞来阻止上述效果

SQL Server提供了5种选项来避免不同级别的事务之间的影响

隔离等级由低到高分别为

Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

Read commited(可能出现不可重复读,幻读)

Repeatable Read(可能出现幻读)

Serializable(最低的性能,一次只能执行一个事务,但避免了上述所有情况)

SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担,因为不是标准ANSI SQL标准,不详细讨论)

 

总之,不同的隔离级别是通过加不同的锁,造成阻塞来实现的,来看一个例子:

SQL SERVER通过阻塞来阻止脏读,所以保持独立性会以付出性能作为代价:

理解持久性(Durability)

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

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

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

"若要了解预写日志的工作原理,最重要的是了解如何将修改的数据写入磁盘。SQL Server 维护当必须检索数据时,将数据页读入的缓冲区高速缓存。数据修改不是直接在磁盘上进行,而是修改高速缓冲存储器中的页副本。直到数据库中出现检查点,或者必须将修改写入磁盘才能使用缓冲区来容纳新页时,才将修改写入磁盘。将修改后的数据页从高速缓冲存储器写入磁盘的操作称为刷新页。在高速缓存中修改但尚未写入磁盘的页称为“脏页”。

对缓冲区中的页进行修改时,将在记录修改的日志高速缓存中生成一条日志记录。在将关联的脏页从高速缓冲存储器刷新到磁盘之前,必须将这条日志记录写入磁盘。如果在写入日志记录前刷新脏页,则该脏页便会在磁盘上创建修改。如果服务器在将日志记录写入磁盘前失败,则不能回滚此修改。SQL Server 具有防止在写入关联的日志记录前刷新脏页的逻辑。日志记录将在提交事务时写入磁盘。"(MSDN)

总结

本文简单讲述了ACID的概念和ACID在SQL SERVER中的实现.ACID只是一个理念,并不是某项具体的技术.对于健壮数据库来说,保证ACID是可靠数据库的前提.

分享到:
评论

相关推荐

    数据库SQL知识点总结、代码及练习题代码

    数据库mysql、SQL server压缩包包含内容: 1.数据库的创建修改批量插入等基本操作及sql文件 2.数据表的约束、查询及sql文件 3.SQL server函数及sql文件 常量变量函数 4.关于cascade使用的sql文件 删除...8.事务ACID理解

    spring 事务管理的理解

    事务管理确保了数据库操作的原子性、一致性、隔离性和持久性(ACID属性),这对于任何处理数据的应用程序来说至关重要。本文将深入探讨Spring中的事务管理,包括其基本概念、工作原理以及如何在实际项目中配置和使用...

    MySQL数据库:事务的概述、ACID.pptx

    理解 —— 事务的属性ACID; 事务概述 在MySQL环境中,事务由作为一个单独单元的一个或多个SQL语句组成。这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,...

    数据库系统中事务的ACID原则.pdf

    数据库系统中事务的 数据库系统中事务的ACID原则 原则 事务的原⼦性、⼀致性、独⽴性及持久性 事务的原⼦性是指⼀个事务要么全部执⾏,要么不执⾏.也就是说⼀个事务不可能只执⾏了⼀半就停⽌了.⽐如你从取款机取钱,这...

    MyBatis 事务管理解析:颠覆你心中对事务的理解!.docx

    通常,事务包含四个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID。此外,数据库系统提供了不同的事务隔离级别,如读未提交(Read Uncommitted)、读...

    Acid

    在IT领域,"Acid"通常与 Acid Tests 相关联,这是一个术语,特别是在数据库管理和Web标准测试中。..."accord.rar"和"acid"是可能包含相关信息的文件,需要进一步解压和查看才能深入理解它们的具体内容。

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    事务及其ACID属性 事务是一个逻辑处理单元,由一组SQL语句组成,具有原子性、 一致性、隔离性和持久性四个属性。原子性保证事务是一个不可分割的操作单元;一致性保证事务开始和完成时数据的一致性;隔离性保证事务...

    MySQL如何实现事务的ACID

    【MySQL如何实现事务的ACID】 在MySQL数据库中,事务的ACID特性是其核心功能,确保了数据处理的可靠性和一致性。ACID分别代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性...

    JTS事务理解1

    事务有四个基本属性,通常被称为ACID特性: 1. 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不存在部分成功的情况。 2. 一致性(Consistency):事务完成后,系统必须处于一个一致的状态,所有的...

    第八讲-分布式事务原理及应用.pdf

    事务的基本概念-ACID 2 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性: 原子性、一致性、隔离性、持久性。这...

    java事务管理和事务分类

    事务是数据库操作的基本单元,遵循ACID原则,即原子性、一致性、隔离性和持久性。在Java中,事务处理通常与数据库操作密切相关,尤其是通过JDBC(Java Database Connectivity)进行的数据库交互。 1. **原子性**:...

    spring事务操作试验

    首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务管理分为两种模式:声明式事务管理和编程式事务管理。声明式事务管理通过配置元数据(如XML或...

    java分布式事务demo

    分布式事务处理通常涉及ACID(原子性、一致性、隔离性和持久性)原则,这些原则是传统数据库事务管理的基础。在Java中,实现分布式事务的方法有很多,例如使用JTA(Java Transaction API)或者Spring框架的声明式...

    Java事务设计模式_java_事务设计模式_

    首先,我们来理解事务的基本概念。事务是数据库操作的基本单元,它保证了一组操作要么全部成功,要么全部失败,遵循ACID(原子性、一致性、隔离性和持久性)原则。在Java中,事务管理是通过JDBC API或者Spring框架的...

    sql事务全攻略,用实例介绍事务应用

    本资料“sql事务全攻略”深入浅出地探讨了这一主题,旨在帮助读者理解并掌握事务的应用。 1. **事务的基本概念** 事务是一组数据库操作,这些操作被视为一个逻辑工作单元,必须全部成功或全部失败。如果其中任何...

    事务处理--介绍事务原理和事务实现.docx

    在IT领域,事务处理是数据库管理系统中的核心概念,它确保了数据的一致性和完整...理解事务的概念、原理和实现方式,能够帮助开发者在设计和实现高可用、高性能的应用时,有效地管理数据的变更,防止数据不一致和丢失。

    java事务设计模式

    Java事务设计模式是复杂且至关重要的,开发者需要理解不同事务模型的适用场景,熟悉JTA提供的工具和接口,以及如何避免编程陷阱。正确地设计和实现事务处理,不仅可以确保数据的完整性和一致性,还能提高系统的可...

    asp.net 事务处理

    ASP.NET 事务处理是开发基于ASP.NET web应用程序时不可或缺的一部分,它主要用于确保数据一致性,特别是在进行多步骤操作或涉及多个...通过理解和熟练运用各种事务管理方式,开发者可以构建出更加健壮和可靠的系统。

    分布式事务解决方案.zip

    1. **分布式事务理论基础**:分布式事务的基本概念源于ACID(原子性、一致性、隔离性、持久性)原则,它要求分布式系统中的事务操作如同单机事务一样可靠。在分布式环境中,由于网络延迟、节点故障等问题,实现ACID...

    spring+mybatis的声明式事务

    本文将深入探讨"spring+mybatis的声明式事务"这一主题,帮助你理解并掌握这一核心技术。 1. **Spring事务管理** Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制...

Global site tag (gtag.js) - Google Analytics