sp_getAppLock使用
sp_getAppLock 获取程序资源锁,简单的说就是调用此函数可以达到我们程序中.NET的lock锁的作用.
作用域是当前数据库下
四个参数:
@resource(必填):资源名称,类型nvarchar(255),必填,不区分大小写,如果超出255,则取前255个字符,作用域是当前数据库下.
@lockMode(必填):锁的模式,类型nvarchar(32),必填,五个值供选择:
Shared: 共享, 相当于锁里面的S,
Update: 更新, 相当于锁里面的U
IntentShared: 意向共享, 相当于锁里面的IS
IntentExclusive: 意向更新, 相当于锁里面的IX
Exclusive: 独占, 相当于锁里面的X, 其中我们经常使用的是Exclusive,表示独占上面这个@resource资源
@lockOwner:锁的拥有者,2个值供参考:
1. Transaction:默认值,如果使用这个,则必须显示声明事务,事务结束以后释放锁
2. Session:会话, 会话结束以后释放锁
@lockTimeout:锁的超时时间
@DBPrincipal:数据库角色
我们一般都是使用@LockMode=Exclusive,@LoackMode=Transaction这种方式,所以下面是这种方式的测试.
--不显示声明事务的前提下使用sp_getApplock
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
SELECT 1,GETDATE();
WAITFOR DELAY '00:00:03';
SELECT 1,GETDATE(); /*
以下SQL显示的时间内容可以看出,会话1和会话2还是并行的 <<会话1>>
您试图在没有活动事务的情况下获取事务性应用程序锁。 ----------- -----------------------
1 2017-08-30 10:22:17.883 ----------- -----------------------
1 2017-08-30 10:22:20.887 <<会话2>>
您试图在没有活动事务的情况下获取事务性应用程序锁。 ----------- -----------------------
1 2017-08-30 10:22:18.417 ----------- -----------------------
1 2017-08-30 10:22:21.417 */
--显示声明事务情况下,调用sp_getAppLock BEGIN TRAN
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
SELECT 1,GETDATE();
WAITFOR DELAY '00:00:03';
SELECT 1,GETDATE();
COMMIT
/*
以下SQL显示的时间内容可以看出,会话1和会话2是串行执行的 <<会话1>>
----------- -----------------------
1 2017-08-30 10:29:14.197 ----------- -----------------------
1 2017-08-30 10:29:.197 <<会话2>>
----------- -----------------------
1 2017-08-30 10:29:.200 ----------- -----------------------
1 2017-08-30 10:29:.200 */
当事务结束或者关闭会话或者服务器因为任何原因关闭的时候都会释放所有锁
sp_releaseAppLock的作用是释放锁,当一个事务中只有部分代码需要加锁的时候, 就可以在执行完业务逻辑后再次调用sp_releaseApplock @Resource='XXX' , 这样就可以让堵塞的程序继续执行了.
例如:
BEGIN TRAN
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
WAITFOR DELAY '00:00:03';
SELECT 1,GETDATE();
EXEC sp_releaseapplock @Resource='test'
SELECT 2,GETDATE();
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
WAITFOR DELAY '00:00:03';
SELECT 5,GETDATE();
EXEC sp_releaseapplock @Resource='test'
SELECT 6,GETDATE();
COMMIT /*
会话1 ----------- -----------------------
1 2017-08-30 11:15:23.200 ----------- -----------------------
2 2017-08-30 11:15:23.200 ----------- -----------------------
2017-08-30 11:15:29.200 ----------- -----------------------
6 2017-08-30 11:15:29.200 */ BEGIN TRAN
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
WAITFOR DELAY '00:00:03';
SELECT 3,GETDATE();
EXEC sp_releaseapplock @Resource='test' SELECT 4,GETDATE();
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
WAITFOR DELAY '00:00:03';
SELECT 7,GETDATE();
EXEC sp_releaseapplock @Resource='test' SELECT 8,GETDATE();
COMMIT
/*
会话2 ----------- -----------------------
2017-08-30 11:15:26.200 ----------- -----------------------
2017-08-30 11:15:26.200 ----------- -----------------------
2017-08-30 11:15:32.200 ----------- -----------------------
2017-08-30 11:15:.203
*/
参考资料:
https://msdn.microsoft.com/zh-cn/library/ms189823(v=sql.90).aspx
https://msdn.microsoft.com/zh-cn/library/ms178602(v=sql.90).aspx
测试比较简单,如有不对的地方还请大神指出,谢谢:)
sp_getAppLock使用的更多相关文章
- 使用sp_getAppLock引发的一个小问题
这几天线上频繁报如下的错误:“无法释放应用程序锁(数据库主体: 'public',资源: 'aa'),原因是当前没有保留该应用程序锁.” 下面是写法: declare @result int; BEG ...
- sqlserver事务加锁机制
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- Sql Server 中锁的概念
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- SQL Server锁定【2015.12.17】
锁定的体系分类 1.表级锁 保证数据在逻辑上的一致性. 包含:行级锁.分页锁.表.数据分页.LOB分页以及索引叶子级锁. 2.闩 保证数据在物理上的一致性,系统采用,比锁少耗资源,对用户不可见. ...
- 有关数据库行、锁 的几个问题(rowlock)
行锁的基本说明: SELECT au_lname FROM authors WITH (NOLOCK) 锁定提示 描述 HOLDLOC ...
- Sql Server 常用系统存储过程大全
-- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...
- SQL2005中的事务与锁定(六) - 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
- 16.3.1-sp_getapplock
USE TestSystem BEGIN TRANSACTION test1 EXEC [sp_getapplock] 'AppSourceName' , 'Exclusive' WAITFOR DE ...
- sql 中各种锁随记
一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系 ...
随机推荐
- Mongo查询关键字
- 4、ABPZero系列教程之拼多多卖家工具 集成短信发送模块
ABPZero并没有手机短信发送功能,现在我们来集成一个,为后面注册.登录作铺垫. 阿里云短信服务 首先需要在阿里云开通短信服务,连接地址 开通后,在签名管理中添加一个签名 在模板管理中添加一个模板, ...
- IntelliJ IDEA 使用技巧
本着工欲善其事必先利其器的精神,闷头写代码之外花点时间研究一下自己用的 IDE,其带来的效率提升非常可观. 高效定位代码 无处不在的跳转 项目之间跳转 下一个 ctrl + alt + ] 上一个 c ...
- IdentityServer Topics(5)- 使用第三方登录
ASP.NET Core有一个灵活的方式来处理外部认证. 这包括几个步骤. 如果您使用的是ASP.NET Identity,则许多底层技术细节对您而言都是隐藏的. 建议您还阅读Microsoft文档并 ...
- uImage和zImage的区别
1.各种文件的意义 vmlinux 编译出来的最原始的内核文件,未压缩. zImage 是vmlinux经过gzip压缩后的文件. bzImage bz表示“big zImage”,不是用bzi ...
- motan负载均衡/zookeeper集群/zookeeper负载均衡的关系
motan/dubbo支持负载均衡.zookeeper有集群的概念.zookeeper似乎也能做负载均衡,这3者是什么关系呢? 3个概念:motan/dubbo负载均衡.zookeeper集群.zoo ...
- Nginx+Tomcat实现负载均衡小demo
一.搭建Tomcat服务 下载安装JDK和Tomcat就不说了,太简单了.由于是win7单机环境测试,启动多个Tomcat服务可以通过在server.xml配置文件中修改端口实现.准备两个Tomcat ...
- Java与算法之(1) - 冒泡排序
冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来. 例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3 因为是从小到大排序,4和3 ...
- Axios使用说明
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...
- cs231n spring 2017 lecture3 Loss Functions and Optimization 听课笔记
1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...