SQL2005中的事务与锁定(四)- 转载
------------------------------------------------------------------------
-- 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中的事务与锁定(四)- 转载的更多相关文章
- SQL2005中的事务与锁定(七) - 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
- SQL2005中的事务与锁定(二)- 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone ...
- SQL2005中的事务与锁定(一) - 转载
----------------------------------------------------------------------- -- Author : HappyFlyStone -- ...
- SQL2005中的事务与锁定(三)- 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone ...
- SQL2005中的事务与锁定(八)- 转载
------------------------------------------------------------------------ -- Author : happyflystone - ...
- SQL2005中的事务与锁定(九)-(2)- 转载
-------------------------------------------------------------------------- Author : HappyFlyStone -- ...
- SQL2005中的事务与锁定(六) - 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
- SQL2005中的事务与锁定(九)- 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
- SQL2005中的事务与锁定(五)- 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
随机推荐
- 去掉tppabs冗余代码,怎样批量去掉tppabs代码
去掉tppabs冗余代码,怎样批量去掉tppabs代码 刚用teleport pro拉了一个整站到本地 所有的超链都被强行加了一句tppabs=" 就玩了一把dw的替换功能 查找范围:整 ...
- HTTP协议及其请求头分析
HTTP协议及其请求头分析 HTTP协议及其请求头分析 众所周知,Internet的基本协议是TCP/IP协议,目前广泛采用的FTP.Archie Gopher等是建立在TCP/IP协议之上的应用 ...
- hdu杭电1671 / poj3630 字典树
传送门 题意:输入n串数字 找出是否有存在串的前缀与另一个串相同 如果存在 输出NO否则输出YES 思路:用字典树解决 标记字典树总串的结尾 查找出一个串内部是否有被标记的节点 如果有那么说明存在前缀 ...
- sbt commands
速查手册 常用命令 actions – 显示对当前工程可用的命令 update – 下载依赖 compile – 编译代码 test – 运行测试代码 package – 创建一个可发布的jar包 p ...
- zk 获取session,request,servletContext,response
(参考:http://www.dotblogs.com.tw/rockywang/archive/2010/01/13/12995.aspx) HttpServletRequest request = ...
- thinkphp 关于iframe一次提交完成所有操作
一.上传操作html界面,upload.html <import type='css' file="admin.css.common" /> <import ty ...
- struts2--convention-plugin--零配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- css - float浮动模块的高度问题 解决方案
当一个Div中的子元素都是浮动元素时,该div是没有高度的.通常会带来很多困扰,解决方案如下: 低版本统配兼容: overflow: hidden; 下面是不支持低配浏览器,而且似乎该效果对 P 标签 ...
- GROUP BY 與 Null 值
若群組資料行包含了 Null 值,該資料列將變成結果中的一個群組.若群組資料行內包含了多個 Null 值,Null 值將放入單一群組內.此行為定義於 SQL-2003 標準之中. Product 資料 ...
- [转]RamDisk导致远程桌面客户端无法启动问题
在一次重启系统后发现无法运行远程桌面客户端,运行后进行连接即报错. 查看日志有AppCrash错误: 错误应用程序名称: mstsc.exe,版本: 6.1.7600.16385,时间戳: 0x4a5 ...