下边是我们经常使用的更新方案如下:
declare @CardNo varchar(20)
Begin Tran
-- 选择一张未使用的卡
select top 1 @CardNo=F_CardNo
from Card where F_Flag=0
-- 延迟50秒,模拟并发访问.
waitfor delay '000:00:50'
-- 把刚才选择出来的卡进行注册.
update Card
set F_Name=user,
F_Time=getdate(),
F_Flag=1
where F_CardNo=@CardNo
commit |
问题:如果我们在同一窗口执行同一段代码,但是去掉了waitfor delay子句.两边执行完毕后 我们发现尽管执行了两次注册,但是只注册了一张卡,也就是两个人注册了同一张卡。
悲观锁定解决方案
我们只要对上边的代码做微小的改变就可以实现悲观的锁定。
declare @CardNo varchar(20)
Begin Tran
-- 选择一张未使用的卡
select top 1 @CardNo=F_CardNo
from Card with (UPDLOCK) where F_Flag=0
-- 延迟50秒,模拟并发访问.
waitfor delay '000:00:50'
-- 把刚才选择出来的卡进行注册.
update Card
set F_Name=user,
F_Time=getdate(),
F_Flag=1
where F_CardNo=@CardNo
commit |