SQLSERVER乐观锁定和悲观锁定使用实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档