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 & "'")
  • 相关阅读:
    个人永久性免费-Excel催化剂功能第103波-批量打开多文件或多链接
    个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之八
    个人永久性免费-Excel催化剂功能第101波-批量替换功能(增加正则及高性能替换能力)
    个人永久性免费-Excel催化剂功能第99波-手机号码归属地批量查询
    个人永久性免费-Excel催化剂功能第100波-透视多行数据为多列数据结构
    个人永久性免费-Excel催化剂功能第98波-零代码零距离轻松接触并拥有金融大数据
    个人永久性免费-Excel催化剂功能第97波-快递单号批量查询物流信息
    个人永久性免费-Excel催化剂功能第95波-地图数据挖宝之IP地址转地理地址及不同经纬度版本转换
    个人永久性免费-Excel催化剂功能第96波-地图数据挖宝之全国天气查询(区域最细可到区县,最长预报4天)
    实现兼容document.querySelector的方法
  • 原文地址:https://www.cnblogs.com/pvistely/p/160980.html
Copyright © 2011-2022 走看看