SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

SQL SERVER的锁机制(一)——概述(锁的种类与范围)

SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

 

本文上接SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

 

 

六、各种事务隔离级别发生的影响

修改数据的用户会影响同时读取或修改相同数据的其他用户。即这些用户可以并发访问数据。如果数据存储系统没有并发控制,则用户可能会看到以下负面影响:

· 未提交的依赖关系(脏读)

· 不一致的分析(不可重复读)

· 幻读

(一)脏读:

例:张某正在执行某项业务,如下:

begin traninsert tbUnRead select 3,'张三'unionselect 4,'李四'---延迟秒,模拟真实交易情形,用于处理业务逻辑waitfor delay '00:00:05'rollback tran---此时李某对表中数据进行查询,执行了以下语句:set Transaction isolation level read uncommitted--查询数据select * from tbUnRead where name like '张%'

 

 

则李某可以看到张某所执行的插入语句,把数据添加到了数据库,如下图。

但是张某最终是没有提交事务,而是回滚了事务,所以这条记录并没有真正插入到数据库中。从而发生李某将脏读的数据当成真实的查询结果。

   要解决此问题,就是要把数据库的事务隔离级别由未提交读修改成已提交读。只有当查询结果的正确性不是非常重要,或者是隔一段时间查询一次情况下,即使这一次查询结果是错,而下次查询结果是对的,并不会有太大影响,这才适合使用未提交读。

 

(二)不可重复读

例:张某正在查询数据,如下

set Transaction isolation level read committedbegin transelect * from tbUnRead  where ID=2---延迟秒,模拟真实交易情形,用于处理业务逻辑waitfor delay '00:00:05'select * from tbUnRead  where ID=2commit tran---此时李对表中数据进行了更新,如下语句:update tbUnReadset name='Jack_upd'where ID=2

 

 上面的执行语句造成张某在同一个事务内,两次相同的查询条件,查询到不相同的结果(如下图)。

这是由于“已提交读”隔离级别对共享锁保留的时间是:一旦查询完毕就立即释放,而非事务完成才释放。所在张某虽然还在使用事务,事务过程中的所有独占锁都会一直保留,让事务中所更改的数据别人不可进行查询与更改,直到事务完成。但是,被查询的数据在事务过程中是查询完毕就立即释放共享锁,所以别人仍然可以进行修改,造成一笔事务中,两次相同的查询条件,可以得到不相同的结果。最佳的解决方案是将隔离级别设置为“可重复读”。

“可重复读”事务隔离级别,让事务过程中所曾经建立的共享锁都一直保留到事务完成,虽然可以避免“不可重复读”的问题,但是也会导致数据锁定太久,而别人无法读取数据,影响并发率,甚至提高了“死锁”的发生率。

 

(三)幻读

例:张某正在查询数据,如下

set Transaction isolation level REPEATABLE READbegin transelect * from tbUnRead  where ID=3---延迟秒,模拟真实交易情形,用于处理业务逻辑waitfor delay '00:00:05'select * from tbUnRead  where ID=3commit tran--此时李某新增了一条记录,如下语句:INSERT TBUNreadselect 3,'幻读'

 

 

 

张某已经把隔离级别设置为“可重复读”,虽然是曾经读取的数据,不管是共享锁还是互斥锁都 保留到了事务结束,但是无法阻止其他人运行新增操作,导致第一次查询时没有数据,第二次查询时却有了数据。被称为“幻读”。如下图。

为了避免此类问题,可以将隔离级别设置为“可序列化”,设置之后,则其他人则无法新增数据。

 

 

七、各隔离级别所能防止的访问错误

隔离级别

脏读

不可重复读

幻读

未提交读

已提交读

可重复读

快照

可序列化

 

 

八、常用锁与事务隔离级别间的交互影响

 

已提交读

可重复读

快照

可序列化

共享

读完数据后就释放

事务结束才释放

不加锁,以版本来控制

事务结束才释放

更新

读完数据后就释放或是升级成独占锁

读完数据后就释放或是升级成独占锁

不加锁,以版本来控制

读完数据后就释放或升级成独占锁

独占

事务结束才释放

事务结束才释放

不加锁,以版本来控制

事务结束才释放

 

九、动态锁定管理

数据库引擎使用动态锁定管理策略来控制锁定和系统的最佳成本效益。数据库引擎可以动态调整数据粒度与锁定类型,当使用最低一级的行锁而非更大范围的页锁时,可以降低两个事务要求相同范围的数据锁定的可能性,增强并行访问的能力,可同时服务更多的用户,减小死锁的机率。相反低级锁转为高级锁可以减小系统的资源负担,但会增加并行争用的可能性。

此机制由锁管理器进行管理,每一个锁都需要内存去记录,并且要与锁管理器进行合作,才能完成数据访问操作,你可以想像当表中有100万条记录时,你执行一条没有where语句的update指令时,在默认情况下数据库引擎会采用行锁,但这要记录100万条行锁记录,以及相关的意向共享锁,必定会消耗掉大量的系统资源,当系统资源不足时,数据库引擎会自动提升锁的级别,也就是由行锁提升为页锁,如果资源还是不足,则会再次提升,提升为表锁。

就以上例子来说,如果每个页可以放200条记录,则100万表记录的行锁转为5000个页锁,还省掉了大量的意向共享锁。如果资源还是一足,则可以再次提升锁级别,提升到表锁,这样就只需要一个锁就可以了。

愈大范围的锁花费在管理锁之上的资源就愈少。但相对来说,同时上线并发访问该资源的人数就越少。例如:或采用行锁,则你访问你的记录,我访问我的记录,互相不影响,但如果升级到页锁,则如果你先抢到该分页,而我要访问的记录又恰恰在这一分页上,则我必须要等你释放该分页之后才能访问。如果升级到表锁,则同一时间,该表中的记录只能一个人才能访问,其他人不能访问。如下图。

 

 

 

一般情况下,是不需要手工去设置锁定范围的,可以由Microsoft SQL Server 数据库引擎视情况而定,使用动态锁定策略确定最经济的锁。 执行查询时,数据库引擎会根据架构和查询的特点自动决定最合适的锁。 例如,为了缩减锁定的开销,优化器可能在执行索引扫描时在索引中选择页级锁。

动态锁定具有下列优点:

· 简化数据库管理。 数据库管理员不必调整锁升级阈值。

· 提高性能。 数据库引擎通过使用适合任务的锁使系统开销减至最小。

· 应用程序开发人员可以集中精力进行开发。 数据库引擎将自动调整锁定。

在 SQL Server 2008 中,锁升级的行为已发生改变,其中引入了 LOCK_ESCALATION选项

转载于:https://www.cnblogs.com/chillsrc/archive/2013/04/27/3047547.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量?

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量? 标准答案: 通常依据各染料对特定波长光的吸光度具有加和性;吸光度值符合朗伯比尔定律,吸光度与浓度成正比;吸光度值分光光度计可以读出;通过联立方程,可以求出拼色各染料在染液中…

oracle云数据库 免费的吗,使用免费的Oracle云服务-创建ATP数据库

前面我们讲了在Oracle的云主机安装数据库,虽然现在安装数据库已经很简单了,但是真正要在生产环境使用,还是需要进行很多配置和优化的,这通常需要专业的人员。而ATP(自治事务性数据库服务)正是Oracle云提供的非常强大的数据库云服务…

请分析比较下列四种染料在相同浓度和相同温度的水染液中的聚集度大小?

请分析比较下列四种染料在相同浓度和相同温度的水染液中的聚集度大小? 标准答案: 染料聚集度从大到小的顺序为:3〉1〉4〉2 比较1-4染料结构差异,1、2共轭体系较短,3、4共轭体系较长,1、3磺酸基在端部,2、4磺酸基在中间; 染料3共轭体系长,范德华力大,而水溶性磺酸基团…

VC++动态链接库深入浅出(转)

1.概论  先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链…

《Two Dozen Short Lessons in Haskell》(二十)分数

《Two Dozen Short Lessons in Haskell》(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学时教程,该书如果不用于赢利,可以任意发布,但需要保留他们的copyright)这本书是学习 Ha…

数字图像课程工程大作业分析

试题分析: 在连续的视频中对火焰及水柱的轨迹检测,效果如图。 ** 提示: 1、火焰可利用亮度和颜色 2、水柱的轨迹需要先用背景差分获得水柱的连通域,然后利用连通域上的像素点进行曲线的拟合,水枪的位置视为已知&#…

设计电子商务网站的10个技巧(转自ITEye)

导读:随着先进科学技术的应用,人们无需外出逛几个小时来“猎”东西,直接坐在家里就可以购买所需商品,支付服务费用。你只需一台电脑就能搞定。人们习惯了周到的服务和漂亮的橱窗,对网店的选择也不例外。因此&#xff0…

C++语法:vector的使用

【1】vector的创建与元素插入【2】vector元素的访问【3】vector的基本使用技巧【4】vector的几个重要操作【1】vector的创建与元素插入 std::vector<cv::Point> points; //vector容器中保存的类型是Point for (int i 0;i < 10;i) {float x rng.uniform(0, img.cols…

C++语法:求vector中的最大值及其位置

代码&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std;int main(){vector<int> a { 2,4,6,7,1,0,8,9,6,3,2 };auto maxPosition max_element(a.begin(), a.end());cout << *maxPosition <&l…

C#编码简单性之函数篇(如何编写简短的C#代码,随时更新)

作者&#xff1a;陈勇出处&#xff1a;blog.csdn.net/cheny_com这是编码简单性系列中的其中一篇&#xff0c;之前几篇包括代码篇和语义篇。因为要积累案例&#xff0c;会随时更新。之前提到&#xff1a;编码简单性的“心法”就是&#xff1a;只要屏幕上有任何两部分代码看上去相…

R学习笔记(1):R是什么

本文最新版已更新至http://thinkinside.tk/2013/05/03/r_notes_1_what.html 在学习量化投资的时候&#xff0c;我发现了R&#xff08;www.r-project.org&#xff09;。R到底是什么呢&#xff1f;在开始之前&#xff0c;先看看R的神奇之处。 1. R初窥 从CRAN&#xff08;The Co…

数字图像处理知识总结

一&#xff1a;基本概念 数字图像&#xff1a;指由被称作像素的小块区域组成的二维矩阵。将物理图像行列划分后&#xff0c;每个小块区域称为像素&#xff08;pixel&#xff09;。每个像素包括两个属性&#xff1a;位置和灰度。图像数字化一般分为采样、量化与编码三个步骤。数…

oracle marley,滚石杂志500大专辑,对欧美音乐感兴趣的可以找来听听。

滚石杂志于2003年11月评选出的滚石杂志五百大专辑。值得一提的是&#xff0c;披头士乐队占据了前五中的三席&#xff0c;前五十中的7席&#xff0c;正式出版的专辑几乎全部入选前五百。排名 演唱者 专辑001 披头士乐队(The Beatles) Sgt. Peppers Lonely Hearts Club Band002 海…

kinect中psi是什么_PSI的完整形式是什么?

kinect中psi是什么PSI&#xff1a;每平方英寸磅/国际人口服务 (PSI: Pound per Square Inch / Population Services International) 1)PSI&#xff1a;每平方英寸磅 (1) PSI: Pound per Square Inch) PSI is an abbreviation of Pound per Square Inch. Pound per Square Inch …

jupyter notebook指定工作目录

【1】打开Anaconda Navigator 打开Anaconda Navigator&#xff0c;点击左侧Environments&#xff0c;点击base(root)->open Terminal 【2】输入指令jupyter notebook --generate-config 按下回车键&#xff0c;弹出config所在位置。 以VS Code打开文件 【3】修改第26…

五、“嵌段共聚醚酯型”易去污整理剂的结构特点及对织物服用性的影响?

“嵌段共聚醚酯型”易去污整理剂的结构特点及对织物服用性的影响? 收集资料阶段 嵌段共聚醚酯型易去污整理剂(简称聚醚酯)是涤纶最早的一种耐久性易去污剂,其商品名称为Permalose T,由英国ICI公司生产,它能使涤纶及其混纺织物具有优良的易去污、抗湿再沾污和抗静电性能。…

linux服务器指示灯,【转】明明白白你的Linux服务器——故障篇 | 旺旺知识库

在Linux/unix服务器的维护过程中&#xff0c;遇到各种各样的问题&#xff1b;有的严重&#xff0c;有的很好解决&#xff0c;有的解决过程我就记录下来与大家分享下&#xff0c;希望能给大家带来帮助。故障一、今天早上来的第一件事&#xff0c;就是检查昨天晚上刚刚重新安装的…

构件图(Component Diagram)—UML图(八)

构件图是显示代码自身结构的实现级别的图表。构件图由诸如源代码文件、二进制代码文件、可执行文件或动态链接库 (DLL) 这样的构件构成&#xff0c;并通过依赖关系相连接 下面这张图介绍了构件图的基本内容&#xff1a; 下面这张图是个构件图的实例&#xff1a; 转载于:https:/…

GAE work

https://appengine.google.com/ can visit in Home, but cannot visit in Office.Download a java SDK for GAE, will write something here.转载于:https://www.cnblogs.com/cnyao/archive/2011/05/05/2038161.html

二进制文件签名_二进制数的签名表示

二进制文件签名Prerequisite: Number systems 先决条件&#xff1a; 数字系统 Until now, we have only talked about positive numbers and have already discussed their mathematical operations. But there also exists negative numbers in the number system, in this a…