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两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系 ...
随机推荐
- vue-devtools(vue 2.0)手动安装与使用 ? 如何处理Vue.js is detected on this page ?
vue-devtools手动安装与使用 一.在github上下载压缩包,github下载地址:https://github.com/vuejs/vue-devtools 二.解压到本地的某盘 三. ...
- ASP.NET 设计模式:应用程序分层与关注点分离(SoC)
应用程序分层设计 应用程序分层属于关注点分离的一种形式,可以通过命名空间.文件夹或采用单独的项目来实现. 下图为一个采用分层设计的项目结构 ASPPatterns.Chap3.Layered.Repo ...
- CentOS环境下tomcat启动超级慢的解决方案
在本地开发环境,应用正常启动. 在CentOS测试环境,应用启动速度也是正常的. 但是在阿里云的生产环境,tomcat启动超级慢,并且在最终打印出来以下内容: org.apache.catalina. ...
- MYSQL数据库表按月备份,滚动,保留6次备份
要求: 每月1日0点:在不影响业务的情况下,备份整月的数据,保留6次备份. 思路: 基于MYSQL事件功能,每月按时完成操作 RENAME语句具有原子性,新旧表无缝切换 RENAME语句仅修改表定义, ...
- RichErp - export import 用法
// --file.js-- function getJSON(url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = functi ...
- WPF 依赖属性源码 洞察微软如何实现DependencyProperty
依赖属性DependencyProperty是wpf最重要的一个类,理解该类如何实现对学习wpf帮助很大! 终于找到了该类的源码!仔细阅读源码,看看微软如何玩的花招! File: Base\Syste ...
- JavaScript基础知识(正则表达式、字符串)
23.正则表达式 作用:定义一个特定的验证字符串内容规则的表达式 注:正则表达式并不是JavaScript独有的:JavaScript支持正则表达式 var a = { }; // 定义一个空对象 ...
- deeplearning.ai 神经网络和深度学习 week3 浅层神经网络 听课笔记
1. 第i层网络 Z[i] = W[i]A[i-1] + B[i],A[i] = f[i](Z[i]). 其中, W[i]形状是n[i]*n[i-1],n[i]是第i层神经元的数量: A[i-1]是第 ...
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...
- Equals()和GetHashCode()方法深入了解
最近在看Jeffrey Richter的CLR Via C#,在看到GetHashCode()方法的时候,有一个地方不是特别明白,就是重写Equals()方法时为什么要把GetHashCode()方法 ...