SQL Server存储过程中防止线程重入处理方式
2024-08-20 17:33:40
对于线程重入,在C#中有lock关键字锁住一个SyncObject,而SQL Server也可用一个表来模拟实现。
先创建一个同步表,相当于C#中的SyncObject,并插入一条记录(初始值为1)
create table SyncTable(id bit)
go
insert into SyncTable (id) values (1)
然后假设有个存储过程,有一系列操作,需要防止多线程同时访问到,可以这样写。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO create PROCEDURE Proc_Test
@name varchar(50)
AS
begin set xact_abort on begin tran update SyncTable set Id = Id * -1 waitfor DELAY '00:00:05' --假设一系列耗时操作 select @name commit tran set xact_abort off END
GO
然后分别打开两个新建查询(相当于两个线程)
exec Proc_Test @name='abc'
exec Proc_Test @name='def'
然后快速的对这两个查询,分别点“执行”
可以看到执行时间,一个是5秒,一个是9秒(因为是人工点的,所以先点的已经运行了差不多1秒)。
表明这个存储过程阻止了线程重入。
最新文章
- jQuery EasyUI Combobox 无法获取属性 options 的值: 对象为 null 或未定义
- atoi()函数
- ReSharper 卸载后 VS2012 没有提示问题
- 2016最全的web前端面试题及答案整理
- MM--发票校验 及基于采购订单的MIRO发票校验过程(
- Windows性能计数器2
- Linux硬盘命名和安装分区
- Building a RESTful Web Service(转)
- Nginx http 500错误分析及解决方法
- RecyclerView分割线——万能分割线
- 3.3.3 PCI设备对可Cache的存储器空间进行DMA读写
- hadoop端口使用配置总结(非常好的总结)
- ES6随手学
- 2017-12-19python全栈9期第四天第二节之列表的增删查改之公共方法len和count和index
- 对评分矩阵进行分解,SVD与LSI
- TCP协议和UDP协议下的socket
- windows中,VS2017下,在Cmake中添加OpenCV依赖
- MVC+EF CODE FIRST的使用
- Apache-一个IP多个主机域名
- 云从科技 OCR任务 pixel-anchor 方法