UPDLOCK.UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改.
测试:
在另一个查询里:

BEGIN TRANSACTION
SELECT * FROM myTable WITH (UPDLOCK) WHERE Id in (1,2,3)
waitfor delay '00:00:10'
update myTable set [Name]='ZZ' where Id in (1,2,3)
commit TRANSACTION

在另一个查询里:
SELECT * FROM myTable WHERE Id in (1,2,3)

可以马上查询到数据。
但如果要更新数据,必须等其他更新锁释放后才能执行。

update myTable set [Name]='ZZ' where Id in (1,2,3)

这就说明,有时候需要控制某条记录在我读取后就不许再进行更新,那么我就可以将所有要处理当前记录的查询都加上更新锁,以防止查询后被其它事务修改.将事务的影响降低到最小

如果不使用这个锁的话,在项目中很有可能出现“事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行”错误。
例如:
表现二:
    用户A读一条纪录,然后修改该条纪录
    这是用户B修改该条纪录
    这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
    这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
    让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
    语法如下:
    select * from table1 with(updlock) where ....

【SqlServer】SqlServer中的更新锁(UPDLOCK)相关推荐

  1. SQLSERVER中的自旋锁

    SQLSERVER中的自旋锁 在SQLSERVER中的锁有很多,例如什么意向共享锁,排他锁,行,页锁 这些都属于LOCK 而latch比lock更轻量级,只在内存中存在,一般用来锁住数据页面,防止多人 ...

  2. 第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

    一. 基本概念 1.共享锁:(holdlock) (1). select的时候会自动加上共享锁,该条语句执行完,共享锁立即释放,与事务是否提交没有关系. (2). 显式通过添加(holdlock)来显 ...

  3. SqlServer 利用游标批量更新数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...

  4. win10系统安装数据库SQL-server过程中出现的问题解决方法

    win10系统安装数据库SQL-server过程中出现的问题解决方法 一.出现提示需要安装Microsoft .NET Framework 3.5的三种解决办法 1,进入网址https://www.m ...

  5. Mysql uplock 更新锁_数据库更新锁WITH UPDLOCK

    今天因为并发的问题,又讨论了一遍.之前以为同时两个线程开启,线程A加了更新锁,线程B没有加,线程A更新后,线程B也会继续下去代码.但是今天测试了一下,原来线程A更新后(解锁),线程B将不会继续,会出现 ...

  6. [转-记] 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11

    原文链接:批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor - 桦仔 - 博客园 ------------------------------------- ...

  7. 获取SQLServer数据库中所有表

    对于获取SQLSERVER数据库中所有表,首先第一步引有SQLDMO.dll 找到文件路径: C:\Program   Files\Microsoft   SQL   Server\80\Tools\ ...

  8. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

  9. sqlserver数据库中清空日志文件

    sqlserver数据库中清空日志文件,清空之后,日志文件仅为1MB.长久以来都在使用,这里贴出来给大家分享一下. 在查询分析器中完成,操作方法如下: DUMP TRANSACTION DataBas ...

最新文章

  1. spring InitializingBean接口分析
  2. fitEllipse函数
  3. 解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题
  4. 好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...
  5. 专业英语笔记:Install and Use Python
  6. php pear mail 发送邮件,PHP用pear自带的mail类库发邮件
  7. 苹果Mac微软office办公套件:Microsoft 365
  8. Windows7 64bit oracle 11g plsql错误 Initialhation orrlr SQK*NET properly installed
  9. Deep Adversarial Decomposition: A Unified Framework for Separating Superimposed Images
  10. w10共享网络没有计算机,在W10局域网内找不到其它共享电脑的解决方案
  11. AR涂涂乐项目之识别图制作制作地球仪线框二
  12. 【ESAPI】WEB安全ESAPI使用
  13. MFC程序的剖析及生死因果揭秘
  14. 不用下载就能在线P图,这款工具分享给你
  15. python变量名可以用下划线开头吗_python以下划线开头的变量和函数的作用
  16. mapDispatchToProps的三种方式mapStateToProps
  17. RazaviChap8
  18. centos7使用rdo安装openstack遇到的问题
  19. [转]第一次考CCIE FAIL的经历……………
  20. Just another Robbery (概率DP)

热门文章

  1. 一款腾讯UED设计的提示插件(使用教程)
  2. spring读取配置文件的几种方式
  3. 手动建库11.2.0.4
  4. JSP+Servlet基础一
  5. mysql insertOrUpdate 方法
  6. java显示本地磁盘所有盘符,显示桌面路径
  7. MySQL之简单示例
  8. 系统设计与架构笔记:ETL工具开发和设计的建议
  9. 数字化校园passport
  10. 【Win32 API学习]打开可执行文件