SQL Server存储过程中防止线程重入处理方式

对于线程重入,在C#中有lock关键字锁住一个SyncObject,而SQL Server也可用一个表来模拟实现。

先创建一个同步表,相当于C#中的SyncObject,并插入一条记录(初始值为1)

SQL Server存储过程中防止线程重入处理方式
create table SyncTable(id bit)
go
insert into SyncTable (id) values (1)
SQL Server存储过程中防止线程重入处理方式

 

然后假设有个存储过程,有一系列操作,需要防止多线程同时访问到,可以这样写。

 
SQL Server存储过程中防止线程重入处理方式
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
SQL Server存储过程中防止线程重入处理方式

然后分别打开两个新建查询(相当于两个线程)

exec Proc_Test @name=abc
exec Proc_Test @name=def

然后快速的对这两个查询,分别点“执行”

可以看到执行时间,一个是5秒,一个是9秒(因为是人工点的,所以先点的已经运行了差不多1秒)。

表明这个存储过程阻止了线程重入。

SQL Server存储过程中防止线程重入处理方式,布布扣,bubuko.com

SQL Server存储过程中防止线程重入处理方式

上一篇:C#对于sql server数据库的简单操作


下一篇:数据库中使用 Synonym和openquery