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

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
     Set recs=Cnn.Execute("SELECT CAST(tsFlag AS BIGINT) FROM Information " & _
                            "WHERE cInforName='
"  & VouchStampFlag & "'")
  当计数器c超过额定数量时提示超时,并回滚事务
  
If c>100 Then
     
MsgBox "保存超时,并发操作太多。。"
      Cnn.RollbackTans
   
End If

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

     当出现并发冲突重新分配TimeStamp后,则再次进行并发处理。
14.更新此单据的TimeStamp标志,用来说明已有保存操作执行,用来触发其他用户的并发冲突。
     Cnn.Execute ("UPDATE Information SET cInforValue='" & tmpTs & "' WHERE cInforName='" & VouchStampFlag & "'")
posted @ 2005-05-23 21:42  Pvistely  阅读(3145)  评论(11编辑  收藏  举报