出现场景
使用ssh老框架下,两人在同一时间内调用同一接口且对同一条数据进行操作。第一个用户请求完之后会更新数据库中版本号的字段。在执行完getHibernateTemplate().update(xxx) 之后查询数据库已经更新,但在第二条数据进来查询版本号发现还是update之前的数据
如上图,左侧为数据库查询到实际的版本号,右侧为hibernate缓存查询到的版本号。
解决方法
在网上查了很多相关的文章,最后发现是hibernate的缓存造成的。第二次查询的是上一个session,也就是缓存。通过断点getHibernateTemplate().getSession() 可以看到第二次进入时有个entitiesKey的Map中存储的值还是更新前的版本号。
然后代码里加入getHibernateTemplate().setAlwaysUseNewSession(true) ,重启后同样的场景下可以发现在第二次getHibernateTemplate().getSession() 中entitiesKey中的map为空。
加入getHibernateTemplate().setAlwaysUseNewSession(true) 代码后,第二次查询不会再通过缓存去取存储的对象,而是重新创建一个session去数据库查询最新的数据。
最后可以看到第二次查询到的数据与数据库是一致的,问题就解决了