SQL数据库乐观锁定和悲观锁定实例_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

SQL数据库乐观锁定和悲观锁定实例

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:锁定悲观实例乐观
黑客防线网安网讯:  本文使用一个实例来说明如何使用乐观锁定和悲观锁定来解决多用户并发的环境里,其他用户已经把你要修改的数据进行了修改而造成数据的不一致的问题。  在实际的多用户并发访问的生产环...

  本文使用一个实例来说明如何使用乐观锁定和悲观锁定来解决多用户并发的环境里其他用户已经把你要修改的数据进行了修改而造成数据的不一致的问题

  在实际的多用户并发访问的生产环境里边我们经常要尽可能的保持数据的一致性而其中最典型的例子就是我们从表里边读取数据,检查验证后对数据进行修改,然后写回到数据库中。在读取和写入的过程中,如果在多用户并发的环境里边,其他用户已经把你要修改的数据进行了修改是非常有可能发生的情况,这样就造成了数据的不一致性。解决这样的办法,SQL SERVER提出了乐观锁定和悲观锁定的概念,下边我以一个实例来说明如何使用乐观锁定和悲观锁定来解决这样的问题。

  /*建立测试表:Card,代表一个真实的卡库,供用户注册。用户要从里边选出一个未使用的卡,也就是F_Flag=0的卡,给用户注册:更新F_Name,F_Time,F_Flag字段。如果出现两个用户同时更新一张卡的情况,是不能容忍的,也就是我们所说的数据不一致行。*/

create table Card(F_CardNO varchar(20),F_Name varchar(20),F_Flag 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

  -- 下边是我们经常使用的更新方案如下:

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子句。两边执行完毕后,我们发现尽管执行了两次注册,但是只注册了一张卡,也就是两个人注册了同一张卡。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-9851-1.html
网站维护教程更新时间:2012-03-21 02:26:13  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer