我們寫乙個資料庫表時一般都是單使用者的。這個問題不大會發現。
假如 trans結構如下
* ticid
ticbh
ticdate
我們呼叫procaddticid
newticid = 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'
newticid = pprcaddticid.upd()
//修改在這裡了
when duplicate//當重複了繼續執行
do 『new』
endnew
endsub
這樣就很好的解決了併發性的問題。
多使用者環境下新手常犯的乙個錯誤
軟體開發人員參與的專案從單使用者單機版已經變成了多使用者環境了,很多新手並沒有真正理解多使用者環境下要注意的問題 經過一些實踐後基本都掌握了書寫 和開發的技巧,但有乙個錯誤出現的概率非常之大。概括的說就是 認為任務所操作的資源是我獨佔的 下面舉乙個例子 如果有乙個業務它有三種狀態 a b c 當業務...
返回乙個資料表的集合
create or replace package pag selecttable istype select table is ref cursor end pag selecttable create or replace procedure pro selecttable tablename ...
資料清洗小記 多使用者呼叫同乙個函式
背景 做資料抽取時,源端遇到多使用者訪問不同所屬表情況,需要使用相同的函式時,在多使用者下需要重新建立。解決 多使用者下遇到使用相同函式的情況時,我們可以選擇重新建立函式,但有時由於函式過多,執行起來不方便,每個使用者都執行一次有時也不便於對於函式的管理。因此我們可以建立一次函式,然後通過賦權的方式...