加锁的主要目的是为了防止并发操作时导致的数据不一致等问题,锁分为共享锁(S)、更新锁(U)、排他锁(X),共享锁与更新只是单向兼容?传说中的单相思?

事务

事务能保证数据操作的原子性,要么内部操作都提交,要么都回退。事务内部某个地方出错时,可以回滚前面的操作,比如更新、删除等。

BEGIN TRAN 

---报错时回滚
IF @@ERROR<>0
ROLLBACK TRAN --执行完后提交
COMMIT TRAN

共享锁

共享锁允许并发事务读取一个资源,资源上存在共享锁时,任何其他事务不能修改数据,但是允许同时读取。

HoldLock 在表上保持共享锁,直到整个事务结束。

执行查询时会默认加上共享锁。

BEGIN TRAN EE
SELECT * FROM AA(HOLDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN EE
BEGIN TRAN RR
SELECT * FROM AA(HOLDLOCK)
COMMIT TRAN RR

上面的例子,都在表AA上加了共享锁,运行结果表明,即使第一个事务没有执行完,第二个事务仍然可以直接查询出结果。这就说明,共享锁是可以同时存在多个的,多个事务可以同时获取同一资源的共享锁。

排他锁

XLOCK 其他事务不能读也不能修改它锁定的资源。

执行更新时会自动添加排他锁。

共享锁与排他锁不能同时存在。

BEGIN TRAN EE
SELECT * FROM AA(HOLDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN EE
BEGIN TRAN RR
UPDATE AA SET TT='' WHERE DD=''
COMMIT TRAN RR

第一个事务在执行完成之前,第二个事务的更新一直没有进行,直到第一个事务完成之后,第二个事务中执行的更新操作才能进行。这就表明,共享锁与排他锁时不能同时存在的。一旦一个事务获取到了一个资源的共享锁,那么只有等到共享锁释放之后,才能被其他事务获取排他锁。

更新锁

UPDLOCK 一次只有一个事务可以获得资源的更新锁,获取了更新锁意味着获取了从共享锁到排他锁的资格。但是不会影响其他的查询,只会阻止那些试图加更新锁的操作。同一时间在同一个资源上不能有两个更新锁,同时加共享锁时允许的。

共享锁与更新锁是兼容的,允许同时在一个资源上。

排他锁与更新锁是不兼容的,不能同时加在一个资源上。

BEGIN TRAN RR
SELECT * FROM AA(UPDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN RR
BEGIN TRAN EE
SELECT * FROM AA(HOLDLOCK)
COMMIT TRAN EE

以上代码测试结果表明,在资源上加了更新锁之后,还可以继续加共享锁,也就说并不影响查询。但是,看下面的例子。

BEGIN TRAN EE
SELECT * FROM AA(HOLDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN EE
BEGIN TRAN RR
SELECT * FROM AA(UPDLOCK)
COMMIT TRAN RR

上面的例子是先加共享锁,然后再加更新锁,测试结果表明,在第一个事务结束之前,第二个事务并不能获取到更新锁。所以,是不是可以说更新锁与共享锁的兼容是单向的。

BEGIN TRAN EE
SELECT * FROM AA(UPDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN EE
BEGIN TRAN RR
SELECT * FROM AA(UPDLOCK)
COMMIT TRAN RR

上面的测试结果表明,不能同时获取同一个资源的更新锁。

BEGIN TRAN EE
SELECT * FROM AA(UPDLOCK)
WAITFOR DELAY '0:0:30'
COMMIT TRAN EE
BEGIN TRAN RR
--SELECT * FROM AA(XLOCK)
UPDATE AA SET TT=''
COMMIT TRAN RR

上面测试表明,加了更新锁,就不能获得排他锁。

MS SQL 锁与事务的更多相关文章

  1. MS sql 无法进行事务日志备份

    问题出在:恢复模型没有设置好我们之所以要备份数据库和事务日志都是为了以防万一,用来恢复.还原数据库的,因此恢复模型必须设置好,在sql server中默认的恢复模型为"简单".一般 ...

  2. sql server 锁与事务拨云见日(下)

    在锁与事务系列里已经写完了上篇中篇,这次写完下篇.这个系列俺自认为是有条不紊的进行,但感觉锁与事务还是有多很细节没有讲到,温故而知新可以为师矣,也算是一次自我提高总结吧,也谢谢大伙的支持.在上一篇的末 ...

  3. (转)SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  4. (转)SQL Server 的事务和锁(一)

    SQL Server 的事务和锁(一)   最近在项目中进行压力测试遇到了数据库的死锁问题,简言之,如下的代码在 SERIALIZABLE 隔离级别造成了死锁: 1 2 3 4 5 6 7 8 9 1 ...

  5. sql server 锁与事务拨云见日(中)

    一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...

  6. sql server 锁与事务拨云见日(上)

    一.概述 讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸 ...

  7. SQL Server中锁与事务隔离级别

    SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...

  8. SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  9. SQL Server创建事务——锁

    参考地址:http://www.cnblogs.com/knowledgesea/p/3714417.html 事务定义: 事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元.它包 ...

随机推荐

  1. Pandas 错误笔记(持续更新)

    更新至2018.5.1 字典生成DataFrame 今天一个字典生成一个DataFrame,采用了以下形式,每一个value都是一个数(不是vector) df = pd.DataFrame({ 'i ...

  2. 数字类型——python3

    今天我为各位小伙伴准备了python3中数字类型,希望能够帮助到你们! Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间. 以下 ...

  3. Python + Appium 获取当前屏幕的截图方法的封装

    使用方法:get_screenshot_as_file(filename),来自于selenium\webdriver\remote\webdiver.py def take_screenShot(s ...

  4. 深度学习之注意力机制(Attention Mechanism)和Seq2Seq

    这篇文章整理有关注意力机制(Attention Mechanism )的知识,主要涉及以下几点内容: 1.注意力机制是为了解决什么问题而提出来的? 2.软性注意力机制的数学原理: 3.软性注意力机制. ...

  5. 微软开源自动机器学习工具NNI安装与使用

    微软开源自动机器学习工具 – NNI安装与使用   在机器学习建模时,除了准备数据,最耗时耗力的就是尝试各种超参组合,找到最佳模型的过程了.对于初学者来说,常常是无从下手.即使是对于有经验的算法工程师 ...

  6. javascript正则表达式学习(二)--位置匹配

    文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...

  7. mongodb副本集实现

    目录 1. 简单介绍 primary: secondary: arbiter: 2.系统环境设置: 3.安装mongodb 安装mongodb 增加配置文件: 添加启动脚本 3. 副本集实现: 1. ...

  8. 我不是bug神(JVM问题排查)

    Story background 回望2018年12月,这也许是程序员们日夜不得安宁的日子,皆因各种前线的系统使用者都需要冲业绩等原因,往往在这个时候会向系统同时写入海量的数据,当我们的应用或者数据库 ...

  9. 用Docker解决坑爹的环境搭建系列——postgresql

    sudo docker pull postgres mkdir -p /data/docker/pgsql sudo docker run -p 54321:5432 --name pgsql -v ...

  10. 从零单排学Redis【铂金二】

    前言 只有光头才能变强 好的,今天我们要上[铂金二]了,如果还没有上铂金的,赶紧先去蹭蹭经验再回来(不然不带你上分了): 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redi ...