公司現在有個需求要生成唯一的訂單號,自己也把自己的思路總結一下,發出來給大家分享,一起討論。
一開始的思路:
1、時間戳+隨機數
2、數據庫建個數字表,每次生成遞增+1
---------------------------------------------------------------------
上面方法經過多線程同時操作測試,會生成重復的訂單號,那怎么辦呢?想到幾個可能的辦法:
1、數據庫加鎖
2、單例
3、寫個wcf,專門生成id
--------------------------------------------------------------------
逐個分析:
1、數據庫加鎖,就是寫存儲過程中進行加鎖,一次只能生成一個,其他的要訪問數據庫只能等待。
begin tran set xact_abort on update baseNumber set basenumber=basenumber+@randomNumber; select baseNumber from basenumber; commit tran
這里說下,當執行update時,就會把表鎖住,其他進程訪問就會等待,一直到commit時才會釋放鎖,所以select basenumber一定是當前進程更新后number。
在300個線程,每個線程進行1000次操作,測試下,沒有出現重復結果。
2、單例
我們web系統,要做服務器集群,一套應用程序,會跑在不同的服務器上,單例是行不通的。
3、寫wcf,就是專門開一個web服務,專門用來生成訂單號,這樣做沒有驗證,理論是可以的,也是要考慮加鎖處理。
-------------------------------------------------------------------------------------
以上也都是自己摸索的,有什么不對的,還請博友們,提出指正,謝謝了,有什么問題的,也可以直接回復。
