siso

明天会更好!

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

对于线程重入,在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秒)。

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

posted on 2014-04-26 20:33  siso  阅读(984)  评论(0编辑  收藏  举报

导航