zoukankan      html  css  js  c++  java
  • 并发处理,请大家给点意见,新增时的处理

    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 & "'")
  • 相关阅读:
    Educational Codeforces Round 20 D. Magazine Ad
    Educational Codeforces Round 20 C. Maximal GCD
    紫书第三章训练2 暴力集
    Educational Codeforces Round 20 B. Distances to Zero
    Educational Codeforces Round 20 A. Maximal Binary Matrix
    紫书第三章训练1 D
    紫书第一章训练1 D -Message Decoding
    HAZU校赛 Problem K: Deadline
    Mutual Training for Wannafly Union #8 D
    紫书第三章训练1 E
  • 原文地址:https://www.cnblogs.com/pvistely/p/160980.html
Copyright © 2011-2022 走看看