使用sp_getAppLock引发的一个小问题
这几天线上频繁报如下的错误:“无法释放应用程序锁(数据库主体: 'public',资源: 'aa'),原因是当前没有保留该应用程序锁。”
下面是写法:
declare @result int;
BEGIN TRANSACTION
EXEC @result= sp_getapplock @Resource = N'aa',@LockMode = 'Exclusive',@LockTimeout=5000;
if @result=-3
BEGIN
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
select @result;
EXEC SP_EXECUTESQL N'update xxx set f_date=f_date'
EXEC sp_releaseapplock @Resource = N'aa';
COMMIT TRANSACTION END
看代码第一反应能够发现,如果@result是其他值或者加锁失败,会不会导致问题的发生,于是尝试了一下(手动滑稽)
结果还真是,如果资源没申请成功会导致下面的报错。 下面为测试代码:
declare @result int;
BEGIN TRANSACTION
--EXEC @result= sp_getapplock @Resource = N'aa',@LockMode = 'Exclusive',@LockTimeout=5000;
--if @result=-3
--BEGIN
-- ROLLBACK TRANSACTION;
--END
--ELSE
BEGIN
select @result;
EXEC SP_EXECUTESQL N'update xxx set f_date=f_date'
EXEC sp_releaseapplock @Resource = N'aa';
COMMIT TRANSACTION END
所以上面的问题,可以记录下@rsult值是其他的情况下,是否也需要进行rollback。
参考链接:
官网提供的例子是可以>=0 为成功,<0为失败。
而代码例子的结构和我贴的结构几乎一致,所以开发人员当时应该是直接copy写法以后,然后就用了,完全没想到有什么其他的坑;→_→
总结:
解决问题的过程很简单也很容易,但能够发现就是一个好事,侧面说明了看文档的重要性。
-----追加
验证资源锁是否存在
declare @resource nvarchar(255) ='aa' --资源字符串
declare @key nvarchar(257)='['+@resource+']';
IF exists(
select 1 from sys.dm_tran_locks
where
resource_type=N'APPLICATION'
AND request_mode=N'X'
and CHARINDEX(@key,resource_description) >0
and resource_database_id=db_id()
)
begin
print ('已存在');
end
else
begin
print ('不存在');
end
使用sp_getAppLock引发的一个小问题的更多相关文章
- 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer
原因: 这里添加的jar包和android自带的jar产生了冲突
- Redola.Rpc 的一个小目标
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...
- UniversalImageLoader的一个小问题
最近在使用UniversalImageLoader时遇到了一个小问题,多个地方同时通过ImageLoader.getInstance().loadImage(url, new ImageSize(dp ...
- 与大家分享robotium一个小问题。Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'
今天和大家分享robotium一个小问题. 我们在运行自已经搭好的框架时,有可能会出现一个找不到类的错误(如上图所示). 问题是重签名工具给出的activity有误,这时我们可以用Appt命令查看重签 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- 关于SQL Server镜像的一个小误区
昨天晚上突然接到客户的电话, 说在配置了镜像的生产环境数据库下修改 “已提交读快照” 选项的时候报错, 需要先取消镜像然后再重新搭建.悲催的是这是个近TB的数据库,问我有没有什么快速的方法.于是我就问 ...
- 先定一个小目标,自己封装个ajax
你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...
- 快速掌握iOS API的一个小技巧
快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...
- Python2 下 Unicode 的一个小bug
关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...
随机推荐
- 转载-Spring Boot应用监控实战
概述 之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.同样利用SpringBoot作为微服务单元的实例化技术选型时,我们不 ...
- C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...
- xcode简介及安装
1. 简介 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由苹果公司开发. Xcode是开发OS X 和 iOS 应用程序的最快捷的方式. Xcode 具有统一的用户界面设计 ...
- poj2528 Mayor's posters(线段树区间修改+特殊离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- ssh的秘钥认证
ssh秘钥认证简述 通常我们会使用x-shell.putty.MobaXterm等支持ssh连接的工具去登录服务器进行管理,而执行ssh命令.scp命令等从一台服务器登录另外一台服务器的时候,通常需要 ...
- 026 模块3-random库的使用
目录 一.random库基本介绍 1.1 random库概述 二.基本随机数函数 2.1 随机数种子 三.扩展随机数函数 3.1 随机数函数的使用 一.random库基本介绍 random库是使用随机 ...
- Mysql使用SSL连接
最近项目中用到了SSL连接,记录一下,环境为windows10,Mysql版本为5.6 查看是否支持 SSL 首先在 MySQL 上执行如下命令, 查询是否 MySQL 支持 SSL: mysql&g ...
- 如何通过php 使用异或(XOR)加密/解密文件
laravel代码如下: /** * @param $q * @param $k * @return string 异或加解密 */ public function jiajiemi($q,$k){ ...
- J2EE简单的分页器
J2EE项目特别是后台管理,或者一部分前台展示数据比较多,通常需要分页把展示折叠在数据区内. 一般有几种方式来实现分页, 一是官方分页插件,二是自己写,三是网上找(类似于第一种) 这里就介绍第二种, ...
- Git服务端下载
链接:http://pan.baidu.com/s/1kVshpQ3提取密码:4g36