talk is cheap. show me the code. 該問題涉及的主要**實現包括
listlistgoodstrack(@param("criteria") goodstrackquerycriteria criteria);
}2.xml定義
select ...
3.service定義
@service
@transactional(propagation = propagation.supports, readonly = true, rollbackfor = exception.class)
public class goodstrackservice extends baseservice
public listgoodstracklist(goodstrackquerycriteria criteria)else
}listlist = new arraylist(goodstrackdtomap.values());
return list;
}}@service
@transactional(propagation = propagation.supports, readonly = true, rollbackfor = exception.class)
public class goodsorderservice extends baseservice
}
大致邏輯就是在goodstrackservice
定義了兩個查詢方法,乙個是直接從資料庫中獲取資料,第二個是從資料庫中獲取資料後進行了一些加工(通過某個字段進行合併累加,類似sum group by),然後在goodsorderservice
的同乙個方法(該方法是乙個事務方法 )中呼叫這兩個查詢,發現rs2中的資料存在問題, 期望是都應該與資料庫表的資料一致,但其中部分資料卻與查出後進行了修改的rs1中的一致。
簡單介紹下mybatis的兩級快取機制
如何開啟二級快取
1.需要在mybatis-config.xml中設定:
支援的屬性:
已經定位到是由於mybatis的一級快取導致,那如何解決本文提到的問題呢? 基本上有三個解決方向。
1.使用快取的方案
既然要使用快取,那就不能更改快取的資料,此時我們可以在需要更改資料的地方把資料做一次副本拷貝,使其不改變快取資料本身, 如
for (goodstrackdto goodstrackdto : listgoodstrack)else
}
使用objectutil.clone()方法(hutool工具包中提供)對需要更改的資料做副本拷貝。
2.禁用快取的方案
在xml的sql定義中新增 flushcache="true" 的配置,使該查詢不使用快取,如下
select ...
禁用快取的另一種方案是將一級快取直接設定為statement來進行全域性禁用,在mybatis-config.xml中配置:
3.避開快取的方案
select ...
避開快取的另一種做法是不使用事務,使兩個查詢不在乙個sqlsession中,但有時候事務是必須的,所以得分場景來。
另外由於mybatis的快取都是基於本地的,在分布式環境下可能導致讀取的資料與資料庫不一致,比如乙個服務例項兩次讀取中間,另乙個服務例項對資料進行了更新,則後一次讀取由於快取還是讀取的舊資料,而不是更新後的資料,可能導致問題。這時可以通過將快取設定為statement級別來禁用mybatis快取,通過redis,memcached等來提供分布式的全域性快取。
開發Silverlight 5的乙個靈異事件
之前用silverlight 4開發了乙個脫離瀏覽器的應用,基本功能是新建乙個文件 錄入相關資訊,並可以儲存為本地檔案。新建文件的時候,顯示乙個childwindow讓使用者錄入文件的名稱等。然後動態把文件編輯的檢視新增到layoutroot中。後來,silverlight 5 rc發布後,為了讓儲...
從乙個菜鳥做起
c c 系統架構師 1 精通c c 程式語言,熟悉windows程式設計環境,4年以上開發intel多核 多cpu軟體系統的經驗 2 熟悉linux併發程式設計 併發計算 分布式處理 多核多cpu系統的軟體架構模式 概念和技巧,2年以上的軟體架構設計經驗 3 熟悉資料結構 常用演算法 作業系統原理和...
jsoup 從乙個檔案載入乙個文件
在本機硬碟上有乙個html檔案,需要對它進行解析從中抽取資料或進行修改。可以使用靜態 jsoup.parse file in,string charsetname,string baseuri 方法 file input new file tmp input.html document doc js...