多用户操作一个数据表时的并发性操作

我们写一个数据库表时一般都是单用户的。这个问题不大会发现。

假如 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

 

这样就很好的解决了并发性的问题。

 

展开阅读全文

没有更多推荐了,返回首页