Hibernate未进行save操作事务提交后DB却更新了,今天工作时,遇到了这个问题,很有意思,但原因很简单。
详细叙述问题
- 没有save操作,事务提交后,db更新了。
原因
- 一开始我以为是上了更新锁的原因 ,我便注释掉了更新锁。
Criteria criteria = getSession()
.createCriteria(DemoModel.class)
.add(Restrictions.eq("xId", xId))
// .setLockMode(LockMode.UPGRADE_NOWAIT)
.setMaxResults(1);
运行结果没有更新,那是肯定的,因为不上更新锁,即便是save了,也不会更新。
- 后来搜了一下才知道,原来是hibernate的快照机制。即一级缓存会将数据库查出的数据保存快照,如果事务提交后,数据与快照中的不符合,就会进行更新操作。
总结
之前我只形而上学知道持久层框架是有一级缓存和二级缓存的,但随着使用memcache、redis等缓存,就忽略了这些。具体想了解的话,搜索hibernate(或mybatis)一级缓存、二级缓存,这里就不详细解释了。
网友评论