Hibernate未進(jìn)行save操作事務(wù)提交后DB卻更新了,今天工作時(shí),遇到了這個(gè)問(wèn)題,很有意思,但原因很簡(jiǎn)單。
詳細(xì)敘述問(wèn)題
- 沒(méi)有save操作,事務(wù)提交后,db更新了。
原因
- 一開(kāi)始我以為是上了更新鎖的原因 ,我便注釋掉了更新鎖。
Criteria criteria = getSession()
.createCriteria(DemoModel.class)
.add(Restrictions.eq("xId", xId))
// .setLockMode(LockMode.UPGRADE_NOWAIT)
.setMaxResults(1);
運(yùn)行結(jié)果沒(méi)有更新,那是肯定的,因?yàn)椴簧细骆i,即便是save了,也不會(huì)更新。
- 后來(lái)搜了一下才知道,原來(lái)是hibernate的快照機(jī)制。即一級(jí)緩存會(huì)將數(shù)據(jù)庫(kù)查出的數(shù)據(jù)保存快照,如果事務(wù)提交后,數(shù)據(jù)與快照中的不符合,就會(huì)進(jìn)行更新操作。
總結(jié)
之前我只形而上學(xué)知道持久層框架是有一級(jí)緩存和二級(jí)緩存的,但隨著使用memcache、redis等緩存,就忽略了這些。具體想了解的話,搜索hibernate(或mybatis)一級(jí)緩存、二級(jí)緩存,這里就不詳細(xì)解釋了。