我們寫一個數據庫表時一般都是單用戶的。這個問題不大會發現。
假如 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
這樣就很好的解決了併發性的問題。