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 & "'")
  • 相关阅读:
    DRF
    DRF
    DRF
    DRF
    RESTful介绍
    DRF parser请求处理流程
    Vue项目的创建
    怎么清除file控件的文件路径
    java用spring实现文件下载
    JS判断元素是否在数组内 阿星小栈
  • 原文地址:https://www.cnblogs.com/pvistely/p/160980.html
Copyright © 2011-2022 走看看