并发处理,请大家给点意见,新增时的处理

1.定义数据主表TimeStamp字段,用于判断并发状态,并在程序中定义一个单据类型变量VouchStampFlag
   此字段存入并发控制数据表中,在此处为Information表
2.设定主表唯一数据项字段,IdentityField
3.在进行新增单据保存时开始并发处理过程
4.定义保存自动生成主表ID的变量MastId用于定位新增后单据
5.定义临时新增编号存放变量,用于存放由于冲突而生成的新编号,此编号为IdentityField的值,tmpCreateNewId
6.定义一个临时随机数据变量,tmpRnd
7.定义用于保存TimeStamp值的变量,tmpTs
8.生成一个临时随机数存入tmpRnd
     Randomize Second(Time)
     tmpRnd=CStr(Rnd(100000)*1000000)
9.将产生的随机数先保存于并发控制表的相应记录中,此操作用来重置TimeStamp字段
     Cnn.Execute("UPDATE Information SET cInforDefine='" & tmpRnd & "' WHERE cInforName='" & VouchStampFlag & "'")
10.将相应tmpRnd记录更新后的TimeStamp值保存至tmpTs中,用于确定是否有并发操作的依据
     当不能找到此记录时说明有其他操作员正也在处理这一过程,因此可以直接提示退出,并指示用户再次执行此操作。
     Set recs=Cnn.Execute("SELECT CAST(tsFlag AS BIGINT) FROM Information WHERE cInforDefine='" & tmpRnd & "' AND cInforName='" & VouchStampFlag & "'")
     If Not recs.EOF Then
       tmpTs=recs.Fields(0).Value
     Else
       MsgBox "有操作员正在执行保存操作,请稍候继续。",vbInformation
       Exit Function
    End If
11.在执行保存操作前先启动一个事务
     Cnn.BeginTrans
12.在执行完保存的SQL操作后,获取SQL自动生成的主表ID
     MastId=CStr(Cnn.Execute("SELECT ISNULL(@@IDENEITTY,0)").Fields(0).Value))
13.并发处理
     定义一个超时计数器,c
     在有定义唯一编码字段并末超时的情况下进行处理。
     获取当前操作目前的TimeStamp
None.gif       Set  recs = Cnn.Execute( " SELECT CAST(tsFlag AS BIGINT) FROM Information " & _
                            "WHERE cInforName='
"    &  VouchStampFlag  &   " ' " )
None.gif  当计数器c超过额定数量时提示超时,并回滚事务
None.gif  
If  c > 100   Then
None.gif     
MsgBox   " 保存超时,并发操作太多。。"
None.gif
      Cnn.RollbackTans
None.gif   
End   If

     判断执行保存SQL前的TimeStamp与当前TimeStamp是否一至,若一至则说明无并发操作,可以继续执行后续的保存操作,并离开并发处理过程,若不一至则说明有另一操作已经先于此过程执行保存,出现并发冲突,将重新分配此唯一编码,此操作中进行计数器累加。
        '此处重新分配唯一编码的方法是重新获取最大编码
None.gif   If  tmpTs  <>  recs.Fields( 0 ).Value  Then                ' 出现并发冲突
None.gif
   c  =  c  +   1                                  ' 计数器加一
None.gif
   tmpTs  =  recs.Fields( 0 ).Value              ' 覆盖原有TimeStamp标志
None.gif
   tmpCreateNewId  =  GetMaxId(ParentTable,  " CAST( "   &  tmpIdentityField  &   "  AS INT) " ) ' 重新分配唯一编码
None.gif
    If  tmpCreateNewId  <>   ""   Then                         ' 更新编码
None.gif
     Cnn.Execute ( " UPDATE  "   &  ParentTable  &  _ 
                   "  SET  "   &  tmpIdentityField  &   " = "   &  tmpCreateNewId  &  _
                   "  WHERE  "   &  tmpMastIdField  &   " = "   &  SaveNewVouch)
None.gif   
End   If
None.gif 
Else
None.gif   
' TODO:正常保存
None.gif
  End   If

     当出现并发冲突重新分配TimeStamp后,则再次进行并发处理。
14.更新此单据的TimeStamp标志,用来说明已有保存操作执行,用来触发其他用户的并发冲突。
     Cnn.Execute ("UPDATE Information SET cInforValue='" & tmpTs & "' WHERE cInforName='" & VouchStampFlag & "'")

转载于:https://www.cnblogs.com/pvistely/archive/2005/05/23/160980.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值