------------------------------------------------------------------------

-- Author : HappyFlyStone

-- Date   : 2009-10-04 09:00:00

-- 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

--       关键字:隔离等级 锁定 意外数据行为 Lock Hint SnapShot

------------------------------------------------------------------------

起了一个早,也没事干,突然想起昨天没有完成的任务,继续上一篇没说完的。

3、可重复读(Repeatable Read

      概念回顾:可重复读等级比已提交读多了一个约定:所有的共享锁定持续到事务结束,不是在读取完数据就释放。数据被设置了共享锁定后其它进程只能进行查询与增加不能更改,显然这个级别的隔离对程序有了更高的要求,因为可能因长时间的共享锁定影响系统的并发性能,增加死锁发生的机率。很显然是解决了不可重复读的意外行为。

  数据测试:

查询一:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 

BEGIN TRAN

SELECT * FROM TA WHERE TCID = 1 --可重复查询,并且读不到未提交的数据

--COMMIT TRAN --Don't commit

SELECT @@SPID

/*

tcid        Tcname

----------- --------------------

1           READ COMMITTED LOCK

(1 行受影响)

------

52

(1 行受影响)

*/

查询二:

INSERT TA SELECT 9,'FF'

/* 

(1 行受影响)

*/

SELECT * FROM TA-- WITH(UPDLOCK) 

WHERE TCID = 1

/*

tcid        Tcname

----------- --------------------

1           READ COMMITTED LOCK

(1 行受影响)

*/

UPDATE TA

SET TCNAME = 'READ COMMITTED REP'

WHERE TCID = 1

/*

--查询一直进行中……被锁定无结果

--修改数据设置了排它锁定必须等到SPID=52的事务结束

*/

查询三:

exec sp_us_lockinfo

很显然查询三中的S,Is(共享及意向共享)锁定一直没消失,因为查询一的事务没有结束,在查询二里可以发现插入与读取(包括在查询一里再次select)是不影响的,并且读取的是未修改前的数据。

  4、快照(SnapShot)

概念回顾:这是SQL SERVER2005的新功能,启用快照后所有的读操作不再受其它锁定影响,读取的数据是通过行版本管制器读取事务开始前逻辑确定并符合一致性的数据行版本。 这个级别隔离与已提交读的行版管理器的差别仅是行版本管理器里历史版本数据多久。

测试数据:

查询一:

ALTER DATABASE TESTCSDN

    SET ALLOW_SNAPSHOT_ISOLATION ON

GO

SELECT * FROM TA WHERE TCID = 1 --OLD数据

BEGIN TRAN

UPDATE TA

SET TCNAME = 'SNAPSHOT'

WHERE TCID = 1

--COMMIT TRAN --Don't commit

SELECT @@SPID

/*

tcid        Tcname

----------- --------------------

1           READ COMMITTED REP

(1 行受影响)

(1 行受影响)

------

52

(1 行受影响)

*/

查询二:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

SELECT * FROM TA WHERE TCID = 1

/*

tcid        Tcname

----------- --------------------

1           READ COMMITTED REP

(1 行受影响)

*/

查询三:

exec sp_us_lockinfo

5、可串行化

概念回顾:这是交易里最健壮最严谨最高级别的隔离。通过索引键范围完全隔离其它交易的干扰,此隔离和select与锁定提示HOLDLOCK效果一样。这个级别基本解决所有的意外行为,显而易见的是并发性能下降或系统资源的损耗上升。

测试数据:

查询一:

DROP TABLE TB

GO

CREATE TABLE TB (ID INT Primary Key, COL VARCHAR(10))

GO

INSERT INTO TB SELECT 1,'A'

GO

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

SELECT * FROM TB WHERE ID BETWEEN 1 AND 5--OLD数据

--COMMIT TRAN --Don't commit

SELECT @@SPID

/*

ID          COL

----------- ----------

1           A

(1 行受影响)

------

52

(1 行受影响)

*/

查询二:

SELECT * FROM TB WHERE ID = 1

/*

ID          COL

----------- ----------

1           A

(1 行受影响)

*/

INSERT TB SELECT 2,'EE'

/* 

--查询一直进行中……被锁定无结果

--修改数据设置了排它锁定必须等到SPID=52的事务结束

*/

UPDATE TB

SET COL = 'SERIALIZABLE'

WHERE ID = 1

/*

--查询一直进行中……被锁定无结果

--修改数据设置了排它锁定必须等到SPID=52的事务结束

*/

查询三:

exec sp_us_lockinfo

可以明显的发现出现大量的索引键范围(RangeS-S……),确保在当前事务未结束之前另外的用户进程无法在索引键范围内插入数据,防此幼影意外行为的发生。可串行化后,除了数据能查询外,不可以修改、增加、删除索引键范围内的任意数据行,必须等到索引上的锁定释放。

结论:通过以的一些测试,我们知道通过隔离等级我们可以控制并发时意外行为,在实际操作的过程中我们可以用激活事务来控制锁的粒度、影响范围,以达到控制并发机制下数据的逻辑正确及数据一致性。最后我们发现通过锁定提示(LOCK HINTS)也可以改变表级锁定类型、锁定周期,达到和设置隔离等级类似的功能。

附录:隔离等级与意外数据行为

意外行为

隔离等级

丢失根据

脏读

不可

重复读

幼影

并发模型

未提交读

悲观

已提交读(锁  定)

悲观

已提交读(行版本)

乐观

可重复读

悲观

快照

乐观

可串行化

悲观

好,到目前为止我们把事务相关的东西介绍得差不多了,并且在提前介绍了部分的锁定,在下面的文章里我们重点对锁进行介绍。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 去掉tppabs冗余代码,怎样批量去掉tppabs代码

    去掉tppabs冗余代码,怎样批量去掉tppabs代码 刚用teleport pro拉了一个整站到本地 所有的超链都被强行加了一句tppabs="   就玩了一把dw的替换功能 查找范围:整 ...

  2. 继承(JAVA)

    继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 一.继承的基本语法: 在Java语言中,用extends关键字表示一个类继承了另 ...

  3. getElementsByClassName的兼容性

    /*----------------------------index.html------------------------------------*/ <!DOCTYPE html> ...

  4. [转载]学习VC MFC开发必须了解的常用宏和指令————复习一下

    1.#include指令  包含指定的文件 2.#define指令   预定义,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善.背后一长串”的宏,它本身并不在编译过程中进行,而 ...

  5. "我爱记单词"测试报告兼功能展示

    "我爱记单词"测试报告兼功能展示 前言: 我们大部分的测试都是一边开发一边完成的,这里给出软件开发基本完成后在使用时的一些测试例子. 一.背景介绍 我们的数据库中一共有10个表: ...

  6. 解决jsp中文乱码问题

    1. 先解决响应中的乱码 何为响应中的乱码?把页面中的"username"改成"用户名"你就知道了. 所谓响应中的乱码,就是显示页面上的乱码,因为页面数据是从服 ...

  7. bzoj1857: [Scoi2010]传送带--三分套三分

    三分套三分模板 貌似只要是单峰函数就可以用三分求解 #include<stdio.h> #include<string.h> #include<algorithm> ...

  8. NLP文本情感分类传统模型+深度学习(demo)

    文本情感分类: 文本情感分类(一):传统模型 摘自:http://spaces.ac.cn/index.php/archives/3360/ 测试句子:工信处女干事每月经过下属科室都要亲口交代24口交 ...

  9. BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息

    SQL Service Broker 是在SQL Server 2005中新增的功能.Service Broker 为 SQL Server 提供队列和可靠的消息传递,可以可用来建立以异步消息为基础的 ...

  10. uploadify 报错集锦

    1.404 : 没有路由 检查 路由的大小写 或者 拼写 2.500: linux 没有读写权限