今天在測試執行緒池死鎖時,想起來當初在公司中遇到的一次資料庫死鎖經歷;
1.起因是有一天我看伺服器日誌,出現了死鎖日誌,並說明情況以前就發生過,不過概率很小;
2.定位出現死鎖問題**,發現是mq消費端,其中大致的業務是(消費乙個訊息,該訊息會攜帶多個商品id及處理方式,然後需要for迴圈進行查詢更新操作)
3.於是想問題出現原因,因為資料庫使用的mysql的innodb引擎,所以在處理更新資料時會使用到行級的排他鎖
(1)想到是否是因為處理速度太慢,引發鎖等待超時?(測試加日誌分析其實處理並不慢,達不到超時的時間)
(2)想到是否由於迴圈依賴鎖資源產生;
4.檢視業務和測試得出的卻是上述第二種情況:原因就是
當併發的接受訊息後,併發處理期間,出現了 1事務中更新a 然後更新b操作,此時2事務中 更新b 更新a操作;
此時如果正好1事務在更新a後,2事務更新b,那麼a b都占有鎖資源,隨後1事務想要更新b,2事務想要更新a,那麼發生死鎖;
5.查明問題原因後就好解決了:
(1)最簡單快速方案,將消費訊息的商品順序進行排序,那麼就會避免出現迴圈依賴死鎖問題,只可能出現等待鎖超時問題;
(2)將mq消費執行緒設定為1,但是消費能力肯定下降,要依照業務需求來定;
(3)使用分布式鎖方式,來禁止相同商品併發消費,也是依照業務嘗試使用;
(4)重構業務**,將整體事務縮小執行時間,避免出現死鎖;
記一次業務中遇到的mysql語句的效能優化
1 生產環境的sql select o.d.sourceid,d.sourcename,d.sourcecode a.id,a.module code,a.module name,case when count is null then 0 else count end hotcount from ...
演算法在業務開發中的一次應用
需求 求籤到頁連續簽到天數 分析 如圖為簽到的標記,如果中間漏簽,會用灰色圖案顯示,並不會計入庫中,因此庫中都是簽到的資訊 帶時間字段 時間相隔一天的為連續,怎麼計算連續天數呢?結果 參考了leetcode裡的演算法 674.longest continuous increasing subsequ...
記錄一次Mybatis使用中遇到的BUG
今天在開發過程中,由於業務需求,需要前台同時輸入多個值進行模糊查詢,所以我預想將輸入的值,以陣列形式傳入,並在 mybatis 的 xml 檔案中,用foreach標籤進行遍歷。在遍歷過程 現了問題,後台報了乙個 mybatis 的錯誤。錯誤如下所示 nested exception is org....