并发处理,请大家给点意见,新增时的处理
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 & "'")
此字段存入并发控制数据表中,在此处为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
![](/Images/OutliningIndicators/None.gif)
"WHERE cInforName='" & VouchStampFlag & "'")
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
判断执行保存SQL前的TimeStamp与当前TimeStamp是否一至,若一至则说明无并发操作,可以继续执行后续的保存操作,并离开并发处理过程,若不一至则说明有另一操作已经先于此过程执行保存,出现并发冲突,将重新分配此唯一编码,此操作中进行计数器累加。
'此处重新分配唯一编码的方法是重新获取最大编码
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
" SET " & tmpIdentityField & "=" & tmpCreateNewId & _
" WHERE " & tmpMastIdField & "=" & SaveNewVouch)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
当出现并发冲突重新分配TimeStamp后,则再次进行并发处理。
14.更新此单据的TimeStamp标志,用来说明已有保存操作执行,用来触发其他用户的并发冲突。
Cnn.Execute ("UPDATE Information SET cInforValue='" & tmpTs & "' WHERE cInforName='" & VouchStampFlag & "'")