------------------------------------------------------------------------
-- Author : HappyFlyStone 
-- Date   : 2009-09-27 21:36:30
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
--       Apr 14 2006 01:12:25 
--       Copyright (c) 1988-2005 Microsoft Corporation
--       Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--      转载请注明出处,更多请关注:http://blog.csdn.net/happyflystone
--      关键字:隔离等级 锁定
------------------------------------------------------------------------

四、 隔离等级
  首先来说说隔离,隔离是一个事务必须与其他事务所进行的资源或数据更改相隔开,显然隔离等级就是相隔的程度了吧。在说隔离级别不得不提及锁的概念,但是在本单不提及锁,在以后听章节里再作说明,大家只要有个印象就行。在这儿我们必须明白两件事:
  1,隔离级别不会影响进程获得数据修改的排它锁,并且这个锁会保存到事务结束。相对于读进程来说,隔离级别就是对读操作的一个保护级别,保护读操作受其它事务影响的程序。
  2,较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。相反,较高的隔离级别减少了用户可能遇到的并发副作用,却需要太多的系统资源及一个事务阻塞其他事务的可能性。
  应平衡应用程序的完整性要求与相应隔离级别的系统开销,在此基础上选择相应的隔离级别。最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需要通过执行某种级别的锁定来完成此操作,而锁定可能会影响其他用户进程。最低隔离级别(未提交读)可以检索其他事务已经修改但未提交的数据。在未提交读中,所有并发副作用都可能发生,但因为没有读锁定或修改阻塞读取,所以开销最少。
  不同的隔离级别决定我们有哪些数据副作用可以发生,而并发模型决定不同隔离等级下如何来限制这些数据行为或如何协调这数据行为。好,那我们来关注一下不同隔离等级下如何限制这些行为的发生。
  未提交读(uncommitted Read):字面理解一下,修改了的未提交数据可以读取。准确点:一个用户进程可以读取另一个用户进程修改却未提交的数据。SQL SERVER对这个等级下的读操作不需要获得任何锁就可以读取数据,因为不需要锁所以不会和其它任何进程互相阻塞,自然而然能读取其它进程修改了的却未提交数据。显然这不是我们理想的一种模式,但是它却有了高并发性,因为读操作没有锁不会影响其它进程的读或写操作。在这种级别下,除了丢失更新(上一讲中的数据可能发生的行为)外,其它行为都有可能发生,冒着数据不一致的风险来避免修改的进程阻塞读取的进程,事务的一致性肯定是得不到保障,显然这是消极并发模式下的回避阻塞频繁的一种解决方案。未提交读那肯定是不适合于股票、金融系统的,但是在一些趋势分析的系统里,要求的只是一种走向,准确性可以不是那么严格时,这个级别因并发性能超强成为首选。
  已提交读(Read Committed):它和未提交读相反,已提交读级别保证一个进程不可能读到另一个进程修改但未提交的数据。这个级别是引擎默认的级别,也是2005乐观并发模式下支持的级别,也就是说已提交读可是乐观的也可以是悲观的,那究竟当前库是属于哪个并发模型下的已提交读呢,这取决于一个READ_COMMITED_SNAPSHOT数据库配置项,并且缺省是悲观并发控制的。这个配置项决定已提交读级别下事务使用锁定还是行版本控制,并很显然行版本控制是乐观并发模式,锁定是悲观并发模式。我们来点角本看看:

--设置已提交读隔离使用行版本控制
ALTER DATABASE testcsdn SET READ_COMMITTED_SNAPSHOT ON
 GO
--查看当前已提交读隔离并发模型
select name,database_id,is_read_committed_snapshot_on  from sys.databases
 /*
   name                  database_id is_read_committed_snapshot_on
 --------------------   ----------- -----------------------------
master                       1           0
 tempdb                       2           0
 model                        3           0
 msdb                         4           0
 ReportServer$SQL2005         5           0
 ReportServer$SQL2005TempDB   6           0
 TestCsdn                     7           1  --current 

 (7 行受影响)
 */
--设置已提交读隔离使用锁定
ALTER DATABASE testcsdn SET READ_COMMITTED_SNAPSHOT OFF
 GO
--查看已提交读隔离并发模型
select name,database_id,is_read_committed_snapshot_on  from sys.databases

 /*
   name                  database_id is_read_committed_snapshot_on
 --------------------   ----------- -----------------------------
master                       1           0
 tempdb                       2           0
 model                        3           0
 msdb                         4           0
 ReportServer$SQL2005         5           0
 ReportServer$SQL2005TempDB   6           0
 TestCsdn                     7           0 --curret

 (7 行受影响)
 */

已提交读在逻辑上保证了不会读到不实际存在的数据。悲观并发下的已提交读,当进程要修改数据时会在数据行上申请排它锁,其它进程(无论是读还是写)必须等到排它锁释放才可以使用这些数据。如果进程仅是读取数据时会使用共享锁,其它进程虽然可以读取数据但是无法更新数据,必须等到共离锁释放(共享锁在数据处理完即释放,比如行共享锁在当前数据行数据处理完就自动释放,不会在整个事务内保留发。)。乐观并发的已提交读,也确保不会读到未提交的数据,不是通过锁定的方式来实现,而是通过行版本控制器生成行的提前交的数据版本,被修改的数据虽然仍然锁定,但是其它进程可以可以读取更新前版本数据。
  可重复读(Repeatable Read):这也是一个悲观并发的级别。可重复读比已提交读要求更严格,在已提交读的基础上增加了一个限制:获取的共享锁保留到事务结束。在这个限制下,进程在一个事务里两交次读取的数据一致,也就是不会读取到其它进程修改了数据。在这儿我们提到共享锁会保留到事务结束,那得申明一下无论哪种级别及并发模型,排它锁是一定要保留到事务结束的。在可重复读级别共享锁同样也会保留到事务结束。那么这种对数据安全的保证是通过增加共享保留的开销为代价的,也就是只要开始一个事务,其它用户进程是不可能修改数据的,显而易见的系统的并发性和性能必然下降。这似乎是我们想像中的一种级别,虽然这个级别暂时无法回避幻影读,而且我们也默许并发及性能下降,那只有对程序员对事务的控制有严格的要求:事务要短并尽量不要人为因素的干扰,减少潜在的锁竞争。
  快照(SnapShot):乐观并发级别。这是2005新增加的一个隔离级别。快照级别与使用乐观并发的已提交读差不多,差别在于行版控制器里的数据版本有多早,这个在以后讲锁时再说。这个级别保证了一个事务读取的数据是事务开始时就在数据库逻辑上确认并符合一致性的数据。读操作不会要求共享锁定,如果要求的数据已经排它,就会通过行版本控制器读取最近的符合一致性的数据。
  可串行化:是目前最严谨、最健壮的一个级别,属于悲观并发。它防止幻影的发生,回避了以前所有意外行为的发生。可串行化意味着系统按进程进入队列的顺序依次、序列化的执行的结果与事务同时运行得到一致的结果。这个最健壮的级别显然共享锁也是随事务开始随事务结束,并通过锁定部分不存在的数据(即索引键范围锁定)来回避幻影的发生。

今天的任务完成,前两篇我只是把理论上的东西整理了一下,下一篇我把意外行为结合隔离等级用点实例来说明,然后再开始整理锁定。

请大家继续关注我的blog: http://blog.csdn.net/happyflystone

SQL2005中的事务与锁定(二)- 转载的更多相关文章

  1. SQL2005中的事务与锁定(七) - 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  2. SQL2005中的事务与锁定(一) - 转载

    ----------------------------------------------------------------------- -- Author : HappyFlyStone -- ...

  3. SQL2005中的事务与锁定(八)- 转载

    ------------------------------------------------------------------------ -- Author : happyflystone - ...

  4. SQL2005中的事务与锁定(九)-(2)- 转载

    -------------------------------------------------------------------------- Author : HappyFlyStone -- ...

  5. SQL2005中的事务与锁定(六) - 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  6. SQL2005中的事务与锁定(四)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  7. SQL2005中的事务与锁定(三)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone  ...

  8. SQL2005中的事务与锁定(五)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  9. SQL2005中的事务与锁定(九)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

随机推荐

  1. Xperf Basics: Recording a Trace (the easy way)(转)

      http://randomascii.wordpress.com/2013/04/20/xperf-basics-recording-a-trace-the-easy-way/   Some ti ...

  2. 纯手工全删除域内最后一个EXCHANGE--How to Manually Uninstall Last Exchange 2010 Server from Organization

    http://www.itbigbang.com/how-to-manually-uninstall-last-exchange-2010-server-from-organization/ 没办法, ...

  3. js修改样式表规则

    <div>adasfsfs</div> <div id="div">adasfsfs</div> <div>adasfs ...

  4. MySQL关系表查询两个表的数据

    如下,有四张表:游戏类型表,游戏表,点卡和游戏关系表,点卡表 CREATE TABLE `gamesType`( `tId` INT AUTO_INCREMENT NOT NULL PRIMARY K ...

  5. JBOSS EAP实战(1)

    JBOSS的诞生 1998年,在硅谷SUN公司的SAP实验室,一个年轻人正坐在电脑前面思考,然后写着什么东西.不,他没有在写程序,他在写辞呈.他正在做出人生的一个重大决定:他要辞掉在SUN的这份工作, ...

  6. SVN---搭建幸福之家

    SVN百度百科对她这样进行阐述:SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...

  7. HTML&amp;CSS_基础03

    一.Meta标签: 1.可以设置网页的关键字 2.用来指定网页描述 3.可以用来网页重定向 具体参数参见:http://www.w3school.com.cn/html5/tag_meta.asp 二 ...

  8. Vue-Router路由Vue-CLI脚手架和模块化开发 之 vue-router路由

    vue-router路由:Vue.js官网推出的路由管理器,方便的构建单页应用: 单页应用(SPA)只有一个web页面的应用,用户与应用交互时,动态更新该页面的内容:简单来说,根据不同的url与数据, ...

  9. java遇见的问题分析

    下面就一些java的一些基本问题进行解释.其中蓝色部分为handsomecui的主观看法 一.synchronized(obj)里面的参数怎么解释? synchronized的参数代表的是“对象锁”代 ...

  10. 九度OJ1205题-递归求解问题

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:5887 解决:2446 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用 ...