取編號算法(多用戶同時操作同一數據資料表),防止編號重復---分數沒有問題
取編號算法:
問題提出:
1.兩個用戶(或者以上)同時打一資料(或單據),為說明清楚, 設有客戶表(Table_Cust.DB)
內有關鍵字段(主關鍵字或者索引)custno,其他還有很多字段.......;如果有A用戶輸入編號
KH001(設這個時候資料表還沒有任何資料),他還沒有存檔; 就在這個時候B用戶也輸入KH001,
,如果焦點退出,我希望這個時候系統不給它過,要有提示(有人正在使用此編號);
2.另外我的系統有個自動取編號的功能; 現在設資料表里已經有KH001,KH002編號;同時有兩用戶,
A用戶點新增,系統會產生KH003編號,此時沒有存檔,B用戶此時點新增系統要產生KH004;
3.如果有用戶占用號碼,此時其他模塊(如應收付帳中有客戶欄位,要校驗客戶編號是否合法)
應該不考慮此占用的號碼
略為分析:
1,其實難點在於並發的控制,特別是多用戶同時取用編號時;(因為存檔時我們再校驗)
2,數據庫類型為Paradox,Infomix,SQL Server,Postgre SQL;
3,現在有兩種做法:(我個人認為都比較麻煩,做起來比較煩,不方便)
A:加一張資料表(Table_NO),專門存放我們取用的編號(占用的編號/還沒有存檔),
新增(更新)操作(退出編號欄位):
手工取用編號:要到兩張資料表中去尋找是否有存在的編號
若有(提示編號已用);否則再存給Table-NO,pass
自動取用編號:要到兩張資料表中去尋找最大的編號,然後加1,再存給Table-NO
一旦有存檔動作:我們要把Table-NO中的相應編號刪除
若有放棄動作:同樣要Table-NO中的相應編號刪除
B:另一種做法是在Table_Cust加一字段(suse),用來標誌是否真正存檔;
也是就是若一用戶取用編號后,我們要做一個假存檔的動作;若沒有真正的存檔,我們
再做刪除的動作;
4.此兩做法,都不是太好:
A.的做法只要修改一個地方,就是新增(更新)操作時,但是同時會存在對Table_NO的並
發控制問題,對於這個問題,我們現在採用對資料表加鎖的方法,但是這也是存在問題,
鎖的時間長短問題,是否能解開鎖的問題,真的比較頭痛;有時會沒辦法控制;
B.的做法就是基於這一點,我們又提出來的新方法,這種方法任何關聯的地方都要修改,
就是那個地方有Table_Cust資料表就要修改,它同時要面對的也是有並發控制,還有死
機的問題
5.所有資料表有到用編號的地方都有此問題,發動難度比較大
希望各位HELP:
分數沒有問題,歡迎大家討論;有講不清楚的地方,我再作補充;我現在尋找的是一種比較
安全可靠方法的實用,各位若有好的方法,一定要說啊;