1. 程式人生 > >記一次訂單號事故

記一次訂單號事故

### 記一次訂單號事故 > 去年年底的時候,我們線上出了一次事故,這個事故的表象是這樣的: >系統出現了兩個一模一樣的訂單號,訂單的內容卻不是不一樣的,而且系統在按照 >訂單號查詢的時候一直拋錯,也沒法正常回調,而且事情發生的不止一次,所以 >這次系統升級一定要解決掉。 經手的同事之前也改過幾次,不過效果始終不好:總會出現訂單號重複的問題, 所以趁著這次問題我好好的理了一下我同事寫的程式碼。 這裡簡要展示下當時的程式碼: ``` /** * OD單號生成 * 訂單號生成規則:OD + yyMMddHHmmssSSS + 5位數(商戶ID3位+隨機數2位) 22位 */ public static String getYYMMDDHHNumber(String merchId){ StringBuffer orderNo = new StringBuffer(new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date())); if(StringUtils.isNotBlank(merchId)){ if(merchId.length()>3){ orderNo.append(merchId.substring(0,3)); }else { orderNo.append(merchId); } } int orderLength = orderNo.toString().length(); String randomNum = getRandomByLength(20-orderLength); orderNo.append(randomNum); return orderNo.toString(); } /** 生成指定位數的隨機數 **/ public static String getRandomByLength(int size){ if(size>8 || size<1){ return ""; } Random ne = new Random(); StringBuffer endNumStr = new StringBuffer("1"); StringBuffer staNumStr = new StringBuffer("9"); for(int i=1;i