技术开发 频道

浅谈SQL Sever数据库中事务的ACID特性

  理解一致性(Consistency)

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

  一致性分为两个层面

  1.数据库机制层面

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

  2.业务层面

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

  理解隔离性(Isolation)

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

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

浅谈SQL Sever数据库中事务的ACID特性

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

浅谈SQL Sever数据库中事务的ACID特性

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

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

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

  脏读

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

浅谈SQL Sever数据库中事务的ACID特性

  下面来看一个例子:

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

浅谈SQL Sever数据库中事务的ACID特性

  不可重复读(Unrepeatable Read)

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

浅谈SQL Sever数据库中事务的ACID特性

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

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

浅谈SQL Sever数据库中事务的ACID特性

浅谈SQL Sever数据库中事务的ACID特性

  幻读(phantom read)

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

浅谈SQL Sever数据库中事务的ACID特性

  下面来看一个例子:

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

浅谈SQL Sever数据库中事务的ACID特性

0
相关文章