1. 程式人生 > >MyBatis如何禁用掉一級快取。

MyBatis如何禁用掉一級快取。

一級快取:同一個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}