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使用的更多相关文章

  1. 使用sp_getAppLock引发的一个小问题

    这几天线上频繁报如下的错误:“无法释放应用程序锁(数据库主体: 'public',资源: 'aa'),原因是当前没有保留该应用程序锁.” 下面是写法: declare @result int; BEG ...

  2. sqlserver事务加锁机制

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...

  3. Sql Server 中锁的概念

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...

  4. SQL Server锁定【2015.12.17】

    锁定的体系分类   1.表级锁 保证数据在逻辑上的一致性. 包含:行级锁.分页锁.表.数据分页.LOB分页以及索引叶子级锁. 2.闩 保证数据在物理上的一致性,系统采用,比锁少耗资源,对用户不可见. ...

  5. 有关数据库行、锁 的几个问题(rowlock)

    行锁的基本说明: SELECT au_lname FROM authors WITH (NOLOCK) 锁定提示                                 描述  HOLDLOC ...

  6. Sql Server 常用系统存储过程大全

    -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...

  7. SQL2005中的事务与锁定(六) - 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  8. 16.3.1-sp_getapplock

    USE TestSystem BEGIN TRANSACTION test1 EXEC [sp_getapplock] 'AppSourceName' , 'Exclusive' WAITFOR DE ...

  9. sql 中各种锁随记

    一. 为什么要引入锁    多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:    丢失更新  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系 ...

随机推荐

  1. Oracle COMMIT语句的处理顺序

    Oracle COMMIT语句相信大家都有一定的了解,下面就为您介绍Oracle COMMIT语句的处理步骤,希望对您能有所帮助. Oracle COMMIT语句处理顺序 当事务提交时,Oracle分 ...

  2. 2017-07-20聊聊《C#本质论》

    第一次接触<C#本质论>是在这个链接.那时候刚学写C#,而且它的语言风格深深吸引了我,噢对了还有它强大的IDE--VS.这个链接里的书确实不错.文中提到: 虽然这三本书都是外国原著的,但是 ...

  3. flask WTForms源码分析及自定义WTForms

    首先我们来创建一个From类 from wtforms.form import Form from wtforms import StringField from wtforms.validators ...

  4. 使用js对form表单base64加密

    利用js可以对前台数据加密,以防止被恶意获取,以下代码,用base64对数据进行加密,可以在后台进行解密. 引入的js <script type="text/javascript&qu ...

  5. git删除本地分支

    远端master分支有更新需要拉取至本地,但是代码有些地方做了修改导致了小冲突,但是这些修改又是无关紧要的,于是就打算直接删除掉本地分支再重新拉取master分支,过程如下: //查看本地分支 git ...

  6. T4模板生成代码。 数据实体层与数据仓储层。备注

    文件生成模板:TempleteManager.ttinclude <#@ assembly name="System.Core" #><#@ assembly n ...

  7. CTF---安全杂项入门第三题 这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?

    这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?分值:30 来源: 2014sctf 难度:难 参与人数:3918人 Get Flag:384人 答题人数 ...

  8. 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案

    基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案 两个月前做C++课设的时候,电脑编译器编译结果出现了中文乱码,寻求了百度和大神们,都没有解决这个问题,百度上一堆解释是对编译器 ...

  9. POJ2407-Relatives-欧拉函数

    欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. Euler函数表达通式:euler(x)=x(1 ...

  10. JSON对象添加删除属性

    假如目前我们有如下一个Json对象 var jsonObj={ 'param1':22, 'param2' :33 }; 增加属性: 我们现在向该对象jsonObj中添加一个新的属性字段:param3 ...