asp.net 多用戶流水號(hào)問(wèn)題 數(shù)據(jù)庫(kù)儲(chǔ)存了員工編號(hào)ZF-0358,讓操作員1新建員工檔案前獲取為ZF-0359,而操作員2新建員工檔案獲取員工編號(hào)為ZF-0360。 但目前如果操作員1、2同時(shí)新建員工檔案時(shí),他們獲取的新編號(hào)均為ZF-0359。如何操作避免多用戶并發(fā)申請(qǐng)新員工編號(hào)時(shí)出現(xiàn)重復(fù)編號(hào)以及跳號(hào)問(wèn)題? ------解決方案-------------------- 首先,編程方式不可能防止跳號(hào)!編程是較低級(jí)的工作,更關(guān)鍵地是你的業(yè)務(wù)邏輯處理。比如說(shuō)1、2、3都創(chuàng)建了流水號(hào),然后2和3都確定保存了,而1放棄了,那么此時(shí)顯然會(huì)跳號(hào)的。 而分配流水號(hào)其實(shí)很簡(jiǎn)單。假設(shè)你有專(zhuān)門(mén)的一個(gè)“最后流水號(hào)”表,這個(gè)表里只有一條記錄,就上保存最后使用過(guò)的流水號(hào),那么你可以寫(xiě) update [最后流水號(hào)] set [編號(hào)]=[編號(hào)]+1 select [編號(hào)] from [最后流水號(hào)] 執(zhí)行它時(shí),要在一個(gè)事務(wù)中執(zhí)行(假設(shè)使用sql server,參考msdn文檔)。由于sql server的事務(wù)處理級(jí)別的規(guī)定, 這就不可能并發(fā)。 ------解決方案-------------------- 其實(shí)兩個(gè)問(wèn)題可以歸為一個(gè)問(wèn)題,解決辦法如下: 1 員工編號(hào)生成的時(shí)機(jī)應(yīng)該是在保存新記錄的時(shí)候,這樣就不會(huì)導(dǎo)致員工編號(hào)脫離數(shù)據(jù)庫(kù)存在的情況 2 查詢當(dāng)前最大員工編號(hào),生成新的編號(hào)等一系列 SQL 語(yǔ)句應(yīng)該在同一個(gè)事務(wù)中執(zhí)行。 請(qǐng)?jiān)囈幌掳?nbsp; |
|
來(lái)自: ThinkTank_引擎 > 《并發(fā)》