手工锁在SQL SERVER中的应用

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:makeitreal
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:本文主要介绍了手工锁的常见类型, NOLOCK、 HOLDLOCK 、UPDLOCK、 TABLOCKX并举例说明它们在实际应用中的具体使用。
  关键词:手工锁;SQL;应用
  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)36-2828-02
  Lock Table Applied in SQL SERVER
  TONG Li-ting
  (Heilongjiang Agricultural Economy professional College, Mudanjiang 157041,China)
  Abstract: The article introduces the general types of lockable such as NOLOCK、 HOLDLOCK 、UPDLOCK、 TABLOCKX and illustrates the practical application by setting examples.
  Key words: Lock Table; SQL; Application
  1 前言
  锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。SQL Server作为一种中小型数据库管理系统,该系统更强调由系统来管理锁。能够自动在满足锁定条件和系统性能之间为数据库加上适当的锁,同时系统在运行期间常常自动进行优化处理,实行动态加锁。
  在实际应用中,有时为了应用程序正确运行和保持数据的一致性,必须人为地给数据库的某个表加锁。比如,在某应用程序的一个事务操作中,需要根据一编号对几个数据表做统计操作,为保证统计数据时间的一致性和正确性,从统计第一个表开始到全部表结束,其他应用程序或事务不能再对这几个表写入数据,这个时候,该应用程序希望在从统计第一个数据表开始或在整个事务开始时能够由程序人为地(显式地)锁定这几个表,这就需要用到手工加锁。
  2 手工加锁的类型
  在SQL Server 的SQL语句(SELECT、INSERT、DELETE、UPDATE)支持手工加锁。所指定的锁类型有如下几种:
  HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放。
  NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“。
  PAGLOCK:指定添加页面锁(否则通常可能添加表锁)。
  READCOMMITTED:设置事务为读提交隔离性级别。
  READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其
  他事务锁定的数据行,而不是阻塞直到其他事务释放锁,READPAST仅仅应用于READ COMMITTED
  READUNCOMMITTED:等同于NOLOCK。
  REPEATABLEREAD:设置事务为可重复读隔离性级别。
  ROWLOCK:指定使用行级锁。
  SERIALIZABLE:设置事务为可串行的隔离性级别。
  TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。
  TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据
  UPDLOCK :指定在读表中数据时设置修改锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他程序更改。
  3 常用手工锁应用举例
  3.1 NOLOCK
  仅在SELECT语句中可以使用。执行对应的T-SQL语句时。不发出共享锁,也不使用派它锁。当此项生效时,可能回读取未提交的事务或一组在读取中间回滚的页面,即有可能发生脏读。
  例如
  连接1代码如下:
  BEGIN TRAN
  Select * From Table(NOLOCK)
  COMMIT TRAN
  连接2代码如下:
  BEGIN TRAN
  Update table1 WITH(Tablock)
  SET FieldB=’UserD’
  WHERE FieldA=’5’
  WAITFOR DELAY ‘0:00:5’--等待5秒
  COMMIT TRAN
  此示例中,同时执行数据库的两个连接中的代码。由于在连接1中使用了NOLOCK锁,而使其不受连接2中一直保持的排它锁的限制,可以立即执行,并且读取到了连接2中未提交的修改。但如果去掉NOLOCK锁,则;连接1中的事务将受到连接2中事务的表级排它锁的限制,必须等到连接2执行完毕才能够执行。
  3.2 HOLDLOCK
  将共享锁保留到事务完成,而不是在相应的表、行或数据面不再需要时就立即释放锁。
  例如:
  BEGIN TRAN
  SELECT * From Tablel (HOLDLOCK)
  WAITFOR DELAY ‘0:00:5’
  COMMIT TRAN
  这将使共享锁一直保持到事务结束。
  3.3 UPDLOCK
  读取表时使用修改锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK的优点是允许读取数据(不但塞其他事务)并在以后更新数据,同时确保自从赏赐读取数据后数据没有被更改。
  例如
  BEGIM TRAN
  SELECT * From Table1 (UpdLock)
  WAITFOR DELAY ‘0:00:5’
  SELECT * FROM Table 1
  COMMIT TRAN
  连接2中的代码如下:
  BEGIN TRAN
  Update table 1
  SET FieldB=’UserD’
  WHERE FieldA=’5’
  COMMIT TRAN
  此示例中,同时执行数据库的两个连接中的代码,由于连接1中的SELECT语句使用了修改锁,所以前后量词读取操作得到的结果是一致的。如果将修改的锁去掉,则会发生非重复读的问题。
  3.4 TABLOCKX
  使用表的排它锁。该锁可以防止其他事务读取或更新表,并在语句或事务结束前一直持有。
  例如:在并发的环境下,两个用户同时保存数据到一张表中,代码如下:
  cn.Begin Trans
  cn.Execute “INSERT INTO table1 ……”
  Set rs=cn.Execute(“SELECT COUNT(*)FROM table1 WHERE……”)
  If rs.RecordCount>0 Then
  ‘表A的字段A不能重复
  cn.RollbackTrans
  Else
  cn.CommitTrans
  End If
  下面分析一下上面程序的執行过程。
  在执行INSERT命令时如果不添加任何参数,数据库默认申请一个IX锁给表A 。当第一个用户执行INSERT INTO 语句时,连接向数据库申请了一个IX锁给表A。同时第二个用户执行INSERT INTO语句,连接也向数据库成功地申请了一个IX锁给表A。但是当执行SELECT COUNT(*)一句的时候就会有问题产生:假设第一个用户先一步执行,由于SELECT命令需要向数据库申请一个S锁给表A,而这时表A已经存在一个IX并且属于另外一个连接。因此它只好在此等候,紧接着第二个用户也执行SELECT COUNT(*)一句,它也会向数据库申请一个S锁给表A,这时数据就会自动结束较晚申请IX锁的连接同时回滚这个事务,这样,对于应用程序要实现的目标来说。就是一个失败。
  针对一个例子中的问题,可以在INSERT命令中带上参数with(tablock)来解决。
   cn.Bengin Trans
  cn.Execute “INSERT INTO tableA with (tablock)……”
  Set rs =cn.Execute(“SELECTCOUNT(*)FROM tableA WHERE ……”)
  If rs.RecordCount>0 Then
  ‘表A的字段A不能重复
  cn.CommitTrans
  End if
  
  4 总结
  由上可见,在SQL Server中可以灵活多样地为SQL语句显式加锁,若适当使用,我们完全可以完成一些程序的特殊要求,保证数据的一致性和完整性。对于一般使用者而言,了解锁机制并不意味着必须使用它。事实上,SQL Server建议让系统自动管理数据库中的锁,而且一些关于锁的设置选项也没有提供给用户和数据库管理人员,对于特殊用户,通过给数据库中的资源显式加锁,可以满足很高的数据一致性和可靠性要求,只是需要特别注意避免死锁现象的出现。
其他文献
摘要:关注对外汉语教学中的隐喻,提高将汉语(在新加坡叫华语)作为第二语言的学习者对隐喻学习的重视,能提高汉语学习的效率,事半功倍。  关键词:隐喻 对外汉语教学 人体隐喻化 概念 认知  一、引言  传统的隐喻观是以亚里士多德为代表的定义:“隐喻是把属于别的事物的字,借来做隐喻。” 简称为“替代论”。 当代的隐喻观是以Lakoff,和Johnson为代表,认为隐喻的本质是指“借它类事物理解该类事物
《牡丹亭》和《罗密欧与朱丽叶》都是人教版高中语文教材中的课文。《牡丹亭》又名《还魂记》,是明代著名剧作家汤显祖的代表作。该剧讲述了深闺中的富家小姐杜丽娘在梦中与书生柳梦梅相爱,在现实中却因相思而死,而后重逢成婚,并因爱重生,最后终成眷属的故事。《罗密欧与朱丽叶》是莎士比亚的悲剧作品之一,其对思想解放与爱情自由的追求,高度契合了文艺复兴时期人文主义的核心思想,成为莎士比亚悲剧中被演绎得最频繁且经久不
2019年初,李行健先生及其编写团队向广大读者贡献了一部特色鲜明、实用方便的新型语文工具书《现代汉语应用规范词典》(语文出版社2019年1月第1版,以下简称《词典》)。这是李先生及其团队几十年来专注编纂的规范型语文工具书的集大成之作,集中体现了《现代汉语规范词典》(外语教学与研究出版社和语文出版社2004年联合出版)、《现代汉语规范字典》(语文出版社1998年出版)、《现代汉语异形词规范词典》(上
书名:英美文学赏析新视野  作者:张晓丽  出版社:吉林大学出版社  出版时间:2020年  ISBN:9787569265729  定价:68元  文学,是语文学科的教学内容之一,也是落实语文核心素养的重要手段之一。在新时代“育人为本”的教育理念下,文学教育的重要性值得被重视,加强语文教学中的文学教育势在必行。由张晓丽著、吉林大学出版社出版的《英美文学赏析新视野》一书是一本可以助力文学教育的英美
摘要:Oracle数据库系统性能调整是一个系统工程,涉及的方面很多。在实际应用中,应根据具体情况采用适当的优化策略。该文从性能优化的基本概念出发,分析了数据库系统性能评价指标,总结了数据库性能优化的主要方面。  关键词:Oracle;数据库;性能;优化  中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2008)29-0289-02  The Adjustment and O
【摘要】长课文由于篇幅大、文字多,阅读时间较长,理解难度大,对老师来说,在有限的教学时间内全面落实教学任务,极具挑战性。长课文“如何教”“如何学”是统编教材全面使用后亟待解决的问题。本文试从“长”与“短”、“深”与“浅”、“详”与“略”三个方面,浅谈长课文教学的辩证思考。  【关键词】统编教材,长课文教学,辩证思考  与以往的教材相比,统编教材的选文具有一个较为明显的特征,就是一些课文的篇幅比较大
摘要:基于UDDI技术的普遍的Web 服务发现、匹配、执行平台有可能产生严重的速率及服务响应延迟问题,本文提出了一种基于multi-agent与分布式缓存技术的服务组合的体系结构,分布式缓存可以提供一种高效的搜索方式,进而比较安全、快速的满足用户请求。文章的最后探讨了Web服务组合的发展趋势以及有待于进一步要做的工作。  关键词:代理;上下文信息;服务组合;蚂蚁算法;信息素   中图分类号:TP3
【摘要】阅读方法、阅读技能与阅读策略的意义重叠之处在于三者都是试图解决“如何阅读”的,但三者的内涵却存在根本性差异。从理论背景来看,阅读方法是基于学科理论的阅读方式,阅读技能则是基于经验背景的阅读方式,阅读策略是基于认知心理学理论的阅读方式。三者虽都是指向“如何阅读”的工具性概念,但原理完全不同。理解了三者理论背景的差别,能让教师对自己所教的阅读方式进行反思和优化,从而提高学生的阅读力。  【关键
大年三十的晚上   你领命去了武汉   带走了八旬老母亲的牵挂   带走了女儿满目泪水的期盼   还有我埋在心底深深的爱   于是每日清晨   手机上的那句一切安好   便是我们最美的相见   妈妈一直守候在电视旁   看到八十高龄的钟南山院士   还坚持奋战在第一线   他因日夜操劳而红肿的双眼   让妈妈心疼得泪水涟涟   紧裹着防护服的医生和护士   我中华民族的勇士   实在是累了 倦了 
一  “生活是写作的源泉”,这话本身并没有错。但如果误读并用偏狭的理解来指导中学作文教学,以至作文题目过多过滥地指向“当下”的“生活”,包括“我”的“生活”,其结果会如何呢?曾宣伟的新著《人字作文法》(2012年7月,文心出版社出版)就列举出种种负面的事实。究其原因,正如曾老师所说,作文内容过多地指向当下的“生活世界”,“其必然忽视了学生阅读中获得的经验,限制了学生的联想和想象,限制了学生自由发挥