MyBatis如何禁用掉一級快取。
阿新 • • 發佈:2019-01-26
一級快取:同一個sqlsession裡面存在,快取用map儲存。
key:sqlsession.hashcode+statementId+sql value:查詢出來的物件。
二級快取:不同sqlsession之間共享查詢結果集。
1、 在配置檔案SqlMapConfig.xml中加入以下內容(開啟二級快取總開關):cacheEnabled設定為 true
2、 每個mapper裡面的每個sql可以配置useCache 來開啟和關閉二級快取。在做一個實時支付專案時遇到一個一級快取導致的重複記賬的問題。
業務場景:業務系統+第三方支付系統。業務系統記賬,向第三方傳送支付請求,第三方支付非同步返回支付結果。
在一段時間內,第三方支付將同一個單號,重複告知業務系統支付成功,按理來說同一個單號只需通知一次,
但是第三方支付抽風了,老是重複告知。
當然就算第三方支付系統重複告知業務系統,業務系統也有校驗的。但是問題就是沒有校驗住。
支付裡面有一段如下的程式碼,在同一個方法內,該方法帶事務的。
1。根據ID查詢單據詳細資訊。呼叫方法A
2。一些邏輯處理
3。分散式應用下利用:select for update 對某個主體進行加鎖。(中間會等待鎖)
4。加鎖之後,再根據同一個ID進行查詢單據。呼叫方法A(此處重複查詢是為了避免 單據狀態已經改變了)
此時檢視log日誌,方法A雖然被呼叫了兩次,但是日誌只打印了一次。此時確認了是一級快取導致的,同一個事務 同一個session,同一個sql.
為了使這個sql的失效,加了一個隨機串到SQL裡面。
兩次查詢分別用 (int)Math.random()*1000 (int)Math.random()*10000
where #{randomString}=#{randomString}