hibernate两人同时操作一条记录,第二次查询时与数据库数据不一致

出现场景

使用ssh老框架下,两人在同一时间调用同一接口且对同一条数据进行操作。第一个用户请求完之后会更新数据库中版本号的字段。在执行完getHibernateTemplate().update(xxx) 之后查询数据库已经更新,但在第二条数据进来查询版本号发现还是update之前的数据

hibernate第二次查询数据不对

如上图,左侧为数据库查询到实际的版本号,右侧为hibernate缓存查询到的版本号。

解决方法

在网上查了很多相关的文章,最后发现是hibernate的缓存造成的。第二次查询的是上一个session,也就是缓存。通过断点getHibernateTemplate().getSession() 可以看到第二次进入时有个entitiesKey的Map中存储的值还是更新前的版本号。

在这里插入图片描述

然后代码里加入getHibernateTemplate().setAlwaysUseNewSession(true) ,重启后同样的场景下可以发现在第二次getHibernateTemplate().getSession() 中entitiesKey中的map为空。

加入getHibernateTemplate().setAlwaysUseNewSession(true) 代码后,第二次查询不会再通过缓存去取存储的对象,而是重新创建一个session去数据库查询最新的数据。

最后可以看到第二次查询到的数据与数据库是一致的,问题就解决了

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值