SQLSERVER乐观锁定和悲观锁定使用实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL SERVER乐观锁定和悲观锁定使用实例
bit,F_Time datetime)
Go
insert Card(F_CardNo,F_Flag)select'1111-1111',0
insert Card(F_CardNo,F_Flag)select'1111-1112',0
insert Card(F_CardNo,F_Flag)select'1111-1113',0
insert Card(F_CardNo,F_Flag)select'1111-1114',0
insert Card(F_CardNo,F_Flag)select'1111-1115',0
insert Card(F_CardNo,F_Flag)select'1111-1116',0
insert Card(F_CardNo,F_Flag)select'1111-1117',0
insert Card(F_CardNo,F_Flag)select'1111-1118',0
insert Card(F_CardNo,F_Flag)select'1111-1119',0
insert Card(F_CardNo,F_Flag)select'1111-1110',0
Go
Begin Transaction
-- 选择一张未使用的卡
select top 1 @CardNo=F_CardNo
from Card where F_Flag=0
waitfor delay'000:00:20'
注解:
declare @CardNo varchar(20)
select top 1 @CardNo=F_CardNo from Card where F_Flag=0
--上句是将从card表中选定的符合条件的第一行的 F_CardNo字段值赋给 @CardNo。
--下句可以验证:
select @CardNo
-- 把刚才选择出来的卡进行注册.
update Card
set F_Name=user,
F_Time=getdate(),
F_Flag=1
where F_CardNo=@CardNo
commit Transaction
改造过的:
declare @CardNo varchar(20)
Begin Transaction
-- 选择一张未使用的卡
select top 1 @CardNo=F_CardNo
from Card where F_Flag=0
-- 延迟秒,模拟并发访问.
waitfor delay '000:00:30' --这30秒是让你有时间在这时间里再执行一次本段代码,模拟并发事务。
-- 把刚才选择出来的卡进行注册.
update Card
set F_Name=user,F_Time=getdate(),F_Flag=1 where F_CardNo=@CardNo commit Transaction
Begin Transaction
-- 选择一张未使用的卡
select top 1 @CardNo=F_CardNo
from Card with(UPDLOCK)where F_Flag=0
--waitfor delay'000:00:50'
--waitfor time '2:12:00'
-- 把刚才选择出来的卡进行注册.
update Card
set F_Name=user,
F_Time=getdate(),
F_Flag=1
where F_CardNo=@CardNo
commit Transaction
declare @timestamp varbinary(8)
declare @rowcount int
Begin Tran
-- 取得卡号和原始的时间戳值
select top 1 @CardNo=F_CardNo,
@timestamp=F_TimeStamp
from Card
where F_Flag=0
-- 延迟秒,模拟并发访问.
--waitfor delay '000:00:50'
-- 注册卡,但是要比较时间戳是否发生了变化.如果没有发生变化.更新成功.如果发生变化,更新失败.
update Card
set F_Name=user,
F_Time=getdate(),
F_Flag=1
where F_CardNo=@CardNo and F_TimeStamp=@timestamp
set @rowcount=@@rowcount--@@rowcount,返回受上一语句影响的行数。
if @rowcount=1
begin
print'更新成功!'
commit
end
else if @rowcount=0
begin
if exists(select 1 from Card where F_CardNo=@CardNo)
begin
print'此卡已经被另外一个用户注册!'
rollback tran
end
else
begin
print'并不存在此卡!'
rollback tran
end
end