mybatis select語句快取使用注意事項
阿新 • • 發佈:2019-02-08
工作中遇到一個select語句快取問題(可提交讀隔離級別下select語句沒有讀取到其它事物更新後的結果),場景如下:
資料庫:mysql
User表結構:
隔離級別:read committed(可提交讀)
Mapper檔案:
程式碼如下:
執行結果:
問題:雖然我們把mysql隔離級別設定為read committed,但是第二次查詢的結果並沒有看到其它事物提交的更新結果。
問題分析:檢視日誌發現第一次的查詢sql打印出來了,但是第二次查詢並沒有列印sql;猜測可能是由於第二次查詢直接使用上一次查詢的快取導致的問題。檢視mybatis使用者手冊,看到select語句中有關於快取的配置:flushCache配置(預設為false)、useCache(預設為true),也就是說select語句預設快取是開啟的,對於我們這個場景應該把這個快取給禁掉。
問題解決:同一個session的select語句上設定flushCache="true"
mybatis手冊中一下兩個配置的解釋:
flushCache
將其設定為true,無論語句什麼時候被呼叫,都會導致快取被清空。預設值:false。
useCache
將其設定為true,將會導致本條語句的結果被快取。預設值:true。
測試發現,如果設定useCache="false"沒有設定flushCache,select的結果還是被快取了;把flushCache設定為true就沒有使用快取結果了。不知道這是不是mybatis的一個bug。