我们写一个数据库表时一般都是单用户的。这个问题不大会发现。
假如 Trans结构如下
* TicID
TicBH
TicDate
我们调用ProcAddTicID
New
TicID = PPrcAddTicID.upd()
....
EndNew
PPrcAddTicID:
Rules: out:&TicID
Source:
for each (TicID)
&TicID = TicID + 1
exit
when none
&TicID = 1
endfor
当单用户执行时ProcAddTicID,我们发现没有任何问题。TicID 为递增的整数。但是我们发现如果多用户(多个电脑,客户端)同时操作ProcAddTicID时,我们就会发现有时写数据库表时,数据就写不进去了。
这是为什么呢?
原因很简单?当第一用户写的时候,假设得到最大值 PPrcAddTicID.upd() 的值 为20,还没有执行数据库提交。而这个时候,第2个,第3个。。。用户得到的PPrcAddTicID.upd() 的值 仍然为20。所以只有第一个用户才能写到数据库中,其他用户不能写到数据库了。
为了更好的处理这种并发操作性,我总结了一个非常好的方法,在实际中也是这么应用的。
我们只要判断如果重复数据了,就继续执行得到最大值,直到写成功为止。
我们修改一下原来的程序就可以了。
ProcAddTicID:
do 'New' //调用过程
Sub 'New'
New
TicID = PPrcAddTicID.upd()
....
//修改在这里了
when duplicate//当重复了继续执行
do ‘New’
EndNew
EndSub
这样就很好的解决了并发性的问题。