加锁的主要目的是为了防止并发操作时导致的数据不一致等问题,锁分为共享锁(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. dictionary.go

    package sego import "github.com/adamzy/cedar-go" // Dictionary结构体实现了一个字串前缀树,一个分词可能出现在叶子节点也 ...

  2. BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理

    BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理 题意: ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种 ...

  3. Python3字符串替换replace(),translate(),re.sub()

    Python3的字符串替换,这里总结了三个函数,replace()和translate()和re.sub() replace() replace() 方法把字符串中的 old(旧字符串) 替换成 ne ...

  4. 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(一)

    作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第一篇,作为前言和概述. 第二篇:基于Oran ...

  5. SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用

    在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...

  6. 《HelloGitHub》第 36 期

    公告 本期内容较多.本期共有 41 个项目:C# 项目(1),C++ 项目(1),CSS 项目(2),Go 项目(5),Java 项目(2),JavaScript 项目(5),Objective-C ...

  7. Sqlserver事务隔离级别详解

    sqlserver存储方式   页    sqlserver是以页的形式存储数据,每个数据页的大小为8KB,sqlserver会把空间分为多个页,sqlserver与数据交互单位最小的io操作就是页级 ...

  8. MySQL · 引擎特性 · InnoDB崩溃恢复

    前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的崩溃恢复机制来保证.本 ...

  9. 内置对象Cookie和Session有何不同【常见面试题】

    我们在面试的时候,时常会被问到Cookie和Session的区别,对于初学者来说,有时候会混淆这两个内置对象.下面就我自己的理解,对这2个内置对象进行剖析. 1.Session对象存在Web服务器端, ...

  10. Rest_framework Serializer 序列化 (含源码浅解序列化过程)

    目录 Rest_framework Serializer 序列化 序列化与反序列化中不得不说的感情纠葛 三角恋之 save/update/create 四角恋之 序列化参数instance/data/ ...