对于线程重入,在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秒)。
表明这个存储过程阻止了线程重入。