ASP教程之保举:SQL 悲观锁定和失望锁定利用实例...
帮助用户快速实现各种应用服务,ASP商有整合各方面资源的能力,可在短期内为用户提供所需的解决方案。例如,典型的ERP安装,如果要在客户端安装的话需要半年到二年的时间,但是美国的一些ASP商如USI和CORIO能在90—120天内提供ERP应用方案。sql在实践的多用户并发会见的临盆情况里边,我们常常要尽量的坚持数据的分歧性。而个中最典范的例子就是我们从内外边读取数据,反省考证后对数据举行修正,然后写回到数据库中。在读取和写进的过程当中,假如在多用户并发的情况里边,其他用户已把你要修正的数据举行了修正长短常有大概产生的情形,如许就形成了数据的纷歧致性。办理如许的举措,SQLSERVER提出了悲观锁定和失望锁定的观点,下边我以一个实例来讲明怎样利用悲观锁定和失望锁定来办理如许的成绩。/*创建测试表:Card,代表一个实在的卡库,供用户注册.用户要从里边选出一个未利用的卡,也就是F_Flag=0的卡,给用户注册:更新F_Name,F_Time,F_Flag字段.假如呈现两个用户同时更新一张卡的情形,是不克不及容忍的,也就是我们所说的数据纷歧致行。*/
createtableCard(F_CardNOvarchar(20),F_Namevarchar(20),F_Flagbit,F_Timedatetime)
Go
insertCard(F_CardNo,F_Flag)select1111-1111,0
insertCard(F_CardNo,F_Flag)select1111-1112,0
insertCard(F_CardNo,F_Flag)select1111-1113,0
insertCard(F_CardNo,F_Flag)select1111-1114,0
insertCard(F_CardNo,F_Flag)select1111-1115,0
insertCard(F_CardNo,F_Flag)select1111-1116,0
insertCard(F_CardNo,F_Flag)select1111-1117,0
insertCard(F_CardNo,F_Flag)select1111-1118,0
insertCard(F_CardNo,F_Flag)select1111-1119,0
insertCard(F_CardNo,F_Flag)select1111-1110,0
Go
--下边是我们常常利用的更新计划以下:
declare@CardNovarchar(20)
BeginTran
--选择一张未利用的卡
selecttop1@CardNo=F_CardNo
fromCardwhereF_Flag=0
--提早50秒,摹拟并发会见.
waitfordelay000:00:50
--把方才选择出来的卡举行注册.
updateCard
setF_Name=user,
F_Time=getdate(),
F_Flag=1
whereF_CardNo=@CardNo
commit
成绩:假如我们在统一窗口实行统一段代码,可是往失落了waitfordelay子句.双方实行终了后我们发明只管实行了两次注册,可是只注册了一张卡,也就是两团体注册了统一张卡.
失望锁定办理计划
--我们只需对上边的代码做巨大的改动就能够完成失望的锁定.
declare@CardNovarchar(20)
BeginTran
--选择一张未利用的卡
selecttop1@CardNo=F_CardNo
fromCardwith(UPDLOCK)whereF_Flag=0
--提早50秒,摹拟并发会见.
waitfordelay000:00:50
--把方才选择出来的卡举行注册.
updateCard
setF_Name=user,
F_Time=getdate(),
F_Flag=1
whereF_CardNo=@CardNo
commit
注重个中的区分了吗?with(updlock),是的,我们在查询的时分利用了with(UPDLOCK)选项,在查询纪录的时分我们就对纪录加上了更新锁,暗示我们行将对次纪录举行更新.注重更新锁和共享锁是不抵触的,也就是其他用户还能够查询此表的内容,可是和更新锁和排它锁是抵触的.以是其他的更新用户就会堵塞.假如我们在别的一个窗口实行此代码,一样不加waifordelay子句.双方实行终了后,我们发明乐成的注册了两张卡.大概我们已发明了失望锁定的弱点:当一个用户举行更新的事件的时分,其他更新用户必需列队守候,即便谁人用户更新的不是统一笔记录.
悲观锁定办理计划
--起首我们在Card内外边加上一列F_TimeStamp列,该列是varbinary(8)范例.可是在更新的时分这个值会主动增加.
altertableCardaddF_TimeStamptimestampnotnull
--失望锁定
declare@CardNovarchar(20)
declare@timestampvarbinary(8)
declare@rowcountint
BeginTran
--获得卡号和原始的工夫戳值
selecttop1@CardNo=F_CardNo,
@timestamp=F_TimeStamp
fromCard
whereF_Flag=0
--提早50秒,摹拟并发会见.
waitfordelay000:00:50
--注册卡,可是要对照工夫戳是不是产生了变更.假如没有产生变更.更新乐成.假如产生变更,更新失利.
updateCard
setF_Name=user,
F_Time=getdate(),
F_Flag=1
whereF_CardNo=@CardNoandF_TimeStamp=@timestamp
set@rowcount=@@rowcount
if@rowcount=1
begin
print更新乐成!
commit
end
elseif@rowcount=0
begin
ifexists(select1fromCardwhereF_CardNo=@CardNo)
begin
print此卡已被别的一个用户注册!
rollbacktran
end
else
begin
print其实不存在此卡!
rollbacktran
end
end
在别的一个窗口里边实行没有waitfor的代码,注册乐成后,前往本来的窗口,我们就会发明到工夫后它显现的提醒是此卡以被别的一个用户注册的提醒.很分明,如许我们也能够制止两个用户同时注册一张卡的征象的呈现.同时,利用这类办法的别的一个优点是没有利用更新锁,如许增添的体系的并发处置才能.
上边我具体先容了悲观锁定和失望锁定的利用办法,在实践临盆情况里边,假如并发量不年夜,我们完整可使用失望锁定的办法,由于这类办法利用起来十分便利和复杂.可是假如体系的并发十分年夜的话,失望锁定会带来十分年夜的功能成绩,以是我们就要选择悲观锁定的办法.
假如人人发明文章里边有甚么毛病的中央,请实时提示我,也接待有乐趣的一同研讨会商.楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。 ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。 先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习 Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件 运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 没有坚实的理论做基础,那么我们连踏入社会第一步的资本都没有,特别对于计算机专业的学生学好专业知识是置关重要的。在这里我侧重讲一下如何学习ASP,从平时的学习过程中。 下载一个源代码,然后再下载一个VBScript帮助,在源代码中遇到不认识的函数或是其他什么程序,都可以查帮助进行解决,这样学习效率很高。 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。
页:
[1]