習慣性為了復用mysql連接,喜歡加上@Transactional(readOnly = true) 只讀事務,很多零碎的查詢下,速度會快一些,也環保一些.
最近用mycat做了讀寫分離,其中一個查詢加上了@Transactional(readOnly = true) ,居然出來了錯誤的數據,
刪除事務后,數據正確,想了半天,是否讀庫寫庫的數據可能不一致.經過比較,果然有一條數據不一致
加上了事務以后(只讀事務也是事務),MYCAT ,就一定會去查詢寫庫.
只讀事務:以下是我方法加上(方法里執行幾十次簡單快速的查詢)
耗時:89880126 (納秒),但是MYCAT會查詢寫庫
不使用事務注解:
耗時:117560025(納秒),正確查詢了讀庫
那么問題來了,有沒有辦法使用ThreadLocal里保存的Mysql連接,同時又可以讓MYCAT正確的查詢讀庫呢?
@Transactional(propagation = Propagation.NOT_SUPPORTED)
耗時:66755063(納秒),正確查詢了讀庫