國慶前公司的**做了一波活動,導致平時流水五六千的**在9月30日的一天流水暴漲到近40w,隨之而來的就是一波大坑。
簡單介紹一下業務場景,乙個**系統,乙個發碼系統。**是賣電子券的,使用者在**購買卡券,**系統就會呼叫發碼系統給客戶進行發碼(簡訊形式),然後把傳送的碼返回給**系統存入卡包。我們有部分**的券碼是購買第三方平台的券碼(如星巴克,肯德基等),購買後把對應的碼匯入到發碼平台。當使用者兌換某個券碼時,就會到發碼平台獲取未傳送的卡券。平時流量小,問題沒有暴露出來,在9月30日這天因為併發量太大,導致有很多客戶收到同一樣的券碼。發現問題時,第一時間去看業務流程(因為是接手的老專案所有並不是非常熟悉),發現流程很簡單就是先按照商品id與狀態查詢資料庫未傳送的券,然後更新狀態為已傳送,最後返回。當時就覺得這個問題很簡單,就直接在方法上加了synchronized,然後更新重啟。
再次去觀察兌換記錄,我勒個xx,發現居然還出現了重**碼的情況。當時就慌了,synchronized怎麼會不生效勒,馬上就嘗試使用this鎖,class鎖,靜態變數鎖,發現都沒有用,問題並沒有解決。最後實在沒有辦法在controller加上鎖,重**碼的問題就沒有再出現了,暫時處理掉問題。但是一般情況下專案經理是不會允許這樣的,身為程式設計者也不會容許這樣的**出自自己之手。
暫時補上漏洞繼續查詢問題,資料快取,mabatis一級快取各個地方都看過了,並沒有發現問題出現的地方。最好在檢視配置檔案時發現了下面的配置:
我勒個圈圈,事物的傳播行為,並且覆蓋了整個業務實現,隨之暫時注釋掉這些配置,測試發現重**碼不再出現。隨之修改對應**,測試,更新伺服器,觀察運**況,問題得到了解決。
總結:鎖與事物同時存在時,鎖是不生效的。出現synchronized失效的問題,多檢查是否與事物存在衝突。
關於STL erase的iterator失效問題
iterator中文經常被譯為 泛型指標 在實際的使用中卻需要比指標更加小心翼翼。如果沒有注意到iterator失效,那麼產生的錯誤可能比普通指標更隱蔽,當然也可能會引起一般的程式異常。iterator失效主要有兩種情況 1 iterator變數已經變成了 野指標 對它進行 都會引起程式記憶體操作異...
關於Java中Synchronized互斥範圍小結
synchronized的使用比較簡單,就是對 進行同步。但是昨天在看書的時候發現了乙個比較困惑的地方,就是類和例項物件之間的同步。有以下幾種情況 1.靜態方法間的同步即對類物件進行同步,執行緒對test1和test2方法的訪問是互斥的 static synchronized void test1 ...
關於java的synchronized關鍵字
synchronized最關鍵的就是確定鎖的物件,我認為有兩種,類和物件 對類的加鎖有兩種方法 1.public synchronized static void fun 在靜態方法前加上synchronized關鍵字。2.synchronized 類名.class 將加鎖的 塊的鎖的位置,寫上類物...