首页 > 数据库技术 > 详细

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

时间:2014-04-26 22:29:22      阅读:983      评论:0      收藏:0      [点我收藏+]

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

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

bubuko.com,布布扣
create table SyncTable(id bit)
go
insert into SyncTable (id) values (1)
bubuko.com,布布扣

 

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

 
bubuko.com,布布扣
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
bubuko.com,布布扣

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

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

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

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

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

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

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

原文:http://www.cnblogs.com/siso/p/3692033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!