惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
I
InfoQ
宝玉的分享
宝玉的分享
G
Google Developers Blog
J
Java Code Geeks
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
腾讯CDC
F
Fortinet All Blogs
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
B
Blog RSS Feed
博客园 - 聂微东
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Cloudflare Blog
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏

博客园 - 花拉子米

第一章、安装odoo的开发环境 [转] sqlserver 索引优化 CPU占用过高 执行分析 服务器检查[转] python操作excel[转] 电子商城项目开发(后台功能模块开发) 【转】 电子商城项目开发(前台功能模块开发)【转】 sql server 全角与半角字符转换 sp_Msforeachtable与sp_Msforeachdb详解 sql server 查看索引碎片大小,并定期重建索引 Git安装 Git使用 sql 索引【转】 SVN安装使用【转】 c# 如何给 dataGridView里添加一个自增长列(列名为序号) asp.net mvc 使用Ajax调用Action 返回数据【转】 MVC与ajax【转】 sql server block如何查询并kill 软件概要设计文档【转】 软件详细设计文档【转】 软件需求规格说明书【转】
sp_getAppLock使用[转]
花拉子米 · 2021-11-20 · via 博客园 - 花拉子米

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:17.197


<<会话2>>
----------- -----------------------
1           2017-08-30 10:29:17.200

----------- -----------------------
1           2017-08-30 10:29:20.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 ----------- ----------------------- 5 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 ----------- ----------------------- 3 2017-08-30 11:15:26.200 ----------- ----------------------- 4 2017-08-30 11:15:26.200 ----------- ----------------------- 7 2017-08-30 11:15:32.200 ----------- ----------------------- 8 2017-08-30 11:15:32.203
*/

复制代码