使用mybatis完成數(shù)據(jù)更新,為防止并發(fā)造成數(shù)據(jù)出錯(cuò),采用樂觀鎖機(jī)制如下:(1)使用select某id的數(shù)據(jù),計(jì)算total再更新操作;(2)更新操作語句利用version實(shí)現(xiàn)樂觀鎖機(jī)制;
update table
set total = #{total,jdbcType=DECIMAL},
version = version + 1
where id = #{id,jdbcType=BIGINT}
and version = #{version,jdbcType=INTEGER}
(3)如果更新失敗,則重復(fù)(1)、(2)步驟,直至超過一定次數(shù)。
但因?yàn)閙ybatis有緩存機(jī)制,在(3)失敗是,重復(fù)執(zhí)行(1),查詢出的結(jié)果仍為舊數(shù)據(jù),而不是數(shù)據(jù)庫最新數(shù)據(jù),導(dǎo)致一直更新失敗。
在(1)之前執(zhí)行clearCache,不起作用
SqlSessionUtils.getSqlSession(sqlSessionFactory).clearCache();
修改mybatis配置,不起作用
<setting name="cacheEnabled" value="false"/>
<setting name="localCacheScope" value="STATEMENT"/>
不起作用。。。不起作用。。。不起作用。。。。。。已崩潰~~~求指教!
2 回答

天涯盡頭無女友
TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
后來發(fā)現(xiàn)是因?yàn)槭聞?wù)的原因。
當(dāng)update失敗后(失敗的原因一定是version不匹配),會重新查詢數(shù)據(jù)最新值,然后再次重試;
因?yàn)槭聞?wù)級別是repeatable-read,所以查詢出來的“最新”值依舊是原值,而不是真正的最新值;
所以需要修改事務(wù)級別為read-commited,問題解決。

湖上湖
TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
我認(rèn)為clearCache,應(yīng)該是清理所謂的一級緩存,是在執(zhí)行insert,update,delete方法后會主動執(zhí)行清理的.這個(gè)也是由MyBatis進(jìn)行自己維護(hù)的,我們一般是不需要過多關(guān)注.
是不是開啟了二級緩存,你可以看看你的Mapper文件中,是不是由<cache/>標(biāo)簽?如果有,刪除一下看看.
添加回答
舉報(bào)
0/150
提交
取消