SQL server锁的机制

所需积分/C币:47 2015-09-23 16:24:00 476KB PDF

SQL server的所有活动都会产生锁。锁定的单元越小,就越能提高并发处理能力,但是管理锁的开销越大。如何找到平衡点,使并发性和性能都可接受是SQL Server的难点。
2)独占(X)锁:用于写操作 仅允许一个事务封锁此共亨数据 其它任何事务必须等到X铁被释放才能对该数据进行访问。 X锁直到事务结東才能被释放 更新(U)锁。 用来预定要对此页施加Ⅹ镤,它允许其它事务读,但不允许再施加U锁或Ⅹ锁 当被读取数据页将要被更新时,则升级为Ⅹ锁 U锁一直到事务结束时才能被释放 三种锁的兼容性 如下表简单描述了三种锁的兼容性 通常,读操作( SELECT)获得共享锁,写操作( INSERT、 DELETE)获得独占锁:而更新操作可分解 为一个有更新意图的读和一个写操作,故先获得更新锁,然后再升级为独占锁 执行的命令获得锁其它进程可以耷询?其它进程可以修改? Select title id from titles s yes n docto where price> 25 X NoNo insert values( titles set type=“ general” U Yes No where type-“ business”然后ⅹNoN 用索引降低锁并发性 我们为什幺要讨论锁机制?如果用户操作效据时尽可能锁定最少的数据,这样处理过程,就不会等待被锁 住的数据解锁,从而可以潜在地提高 SQL Server的性能。如果有200个用户打算修改不同顾客的数 据,仅对存储单个顾客信息的单一行进行加锁要比锁住整个表好得多。那幺,用户如何只锁定行而不是表 昵?当然是使用索引了。正如前面所提到的,对存有要修改数据的字段使用索引可以提高性能,因为索引 能直接找到数据所在的页面,而不是搜索所有的数据页面去找到所需的行。如果用户直接找到表中对应的 行并进行更新操作,只需锁定该行即可,而不是锁定多个页面或者整个表。性能的提高不仅仅是因为在修 改时读取的页面较少,而且锁定较少的页面潜在地避免了一个用户在修改数据完成之前其它用户一直等待 解锁的情况。 事务的隔离级别 ANSI标准为S哑L事务定义了4个隔离级别( isolation level),隔离级别越高,出现数据不一致性的可能 性就越小(并发度也就越低)。较高的级别中包含了较低级别中所规定了的限 隔离级别0:防止“丢失侈改”,允许脏读 隔离级别1:防止班读。允许读已提交的数据。 隔离级别2:防止“不可重复读”。 隔离级别3:“可串行化”( serializable)。其含义为,某组并行事务的一种交叉调度产生的 结果和这些事务的某一串行调度的结果相同(可避免破坏数据一致性)。 SQL Server支持四种隔离级 别,级别1为缺省隔离级别,表中没有隔离级别2 请参考表 SQL Server支持的隔离级别封铁方式数据一致性保证 Ⅹ锁施加亍被修改的爽S嵚施加亍被读取釣页防止丟失修改防匚读脏数据可以重复读取 级别0封到事务结束是 级别1(缺省)封锁到事务结束读后立即释放是是 级别3封锁到事务结束封锁到事务结束是是是 在 SQL Sorver也指定级别2,但级别3已包含级别2。ANSI-92中要求把级别3作为所有事务的 缺省隔离级别 Server用 holdlock选项加强S铁的限制,实现隔奠级别3。 SQL Server的缺省隔离级别为级别 1,共享读铁(S锁)是在该页被读完后立即释放。在 select语句中加 holdlock选项,则可使S锁一直保持 到事务结束才释放。妲符合了ANSI隔离级别3的标准一“可串行化”。 下面这个例子中,在同一事务中对avg( advance)要渎取两次,且要求他们取值不变 “可重复读”,为此要使用选项 holdlockc tran DECLARE @avg-adv money SELECT avg (advance) title holdlock WIIERE type business Wang -ad 5000 SELECT titles WHERE busines advance COMMIT 在SQL. Server中设定事务隔离级别的方法有三种 会话层设定 语法如下 SET TRANSACTION I SOLATION LEVEL READ COMMITTED READ UNCOMMITTED REPEATABLE REA RLAL⊥ LABLE 系统提供的系统冇储过程将在级别1下执行,它不受会话层设定的影响。 语法层设定 在 SELECT、 DECLARE cursol及 read text语句中增加选项。比如 SELECT,,aU isolation o read uncommit Led 注意:语法层的设定将替代会话层的设定 利用关键词设定 在 SELECT语句中,加选项 holdlock则设定级别 一在 SELECT语句中,加 noholdlock则设定级别0 如下程序清单中所列的脚木实例在 authors表上持有一个共亨锁,它将用户检查服务器当前活动的时间推 迟两分钟 程序清单测试事务隔离等级 SET TRANSACTION I SOLATION LEVEL REPEATABLE READ GO BEGIN TRAN SELECT FROM author WHERE WAITFOR ROLLBACK TRAN G Activity Legend(活动图标)表明:当 SQL Server检索数据时会去掉页面表意向锁。 Current Activity窗口(见图3 3)显示共享锁一直被保持直到事务完成为止(也就是说,直到 WAITFOR和 ROLLBACK TRAN语句完成) 使用锁定优化程序提小 让我们再深入考察程序清单的实例。通过改变优化程序提示,用户可以令SQL erver在 authors表上 设置个独占表锁(如程序所示) BEG⊥N TRAN SELECT FROM authors (tablockx) WHERE au lname Green WAITFOR DELAY 0:02:00 ROLLBACK TRAN GO SELECT语句使用优化程序提示 tablockx米保持独占表锁直到事务结東为止。下表显示了可用的锁定优化程 序提示。 锁定优化程序提示及其措述 优化程序提示优化程序提示摧述 holdlock保持锁定直到事务结束 nolock检索数据时不使用锁 glock使用页面锁 tablock使用表锁 tablockx使用独占表钬 undock使用更新锁 holdlock优化程序提示能够在整个事务期间保持共享锁,读者在可串行化和可重复读事务隔离等级中对此 已很熟悉了。如果用户偶尔想使用共享锁,最好使用系统默认的读交付事务隔离等级許需荽使用 holdlock 优化稈序提示。 horlock优化稈序提示与读不交付事务隔离等级有相同的功能,它通过在读数据时不要任何 锁定而实现非交付数据的读操作(从而避兔了任何独占锁定引起的阻隔)。使用索引和锁定优化程序提示需 要注意的是:用户可以将这两和类型的提示结合起来使 用,但必须将索引提示最后列出,这一点很重要。如下程序清单中的代码给出了合法优化程序提示的正确 方法。如一个混合优化程序提小 SELECT FROM authors (padlock holdlock index=aunmind) 读(1399)评论(0)转发 vPr的锁机制 下一篇:如何配置 EQL Server2005以允许远程连接 Mysql开启远程连接方法. dhep peizhi rcc ABAP文章索引 关丁Uux文件的软链接 数据库课程设计报告(仓库管理 求教这个命令什么意思,我是新 拼音汉字对照表 ed-e“/grep/d”是什么意思 ViSualizer8解浸中文乱码 谁能够帮我解决 LINUX2.610 给主人留下些什么吧! 评论热议 请登录后评论 登录册 中级会订师取消 电子商务培训班真人现场娱乐 锁 电子萄务培训 sqlserver解钅 关十我们|关士1168联系方式|广告合作法律声明|免费注册 Copyright2001-2010 Coinalnix. net All Rights Reserved北京皓辰网域网络信息技术有限公司.版权所有 感谢所有关心和支持过 Chinaunix的朋友们 京TCP证041476号京ICP证0i525号

...展开详情
img
myhbwh

关注 私信 TA的资源

上传资源赚积分,得勋章
最新资源