问题现象:
第一个用户投票不成功后,换第二个用户登录,然后投票,投票成功,投票数加1(由14票,变更为15票)。这时刷新页面发现投票数为未投票前的数(14票),再刷新又为更新后的值(15票),不停的刷新,投票数会在新旧值(14与15)之间交替出现。
查看数据库中的表,值是最新的15票。
通过跟踪程序发现,当投票不成功时事务没有正常关闭。代码如下:
TransactionStatus status = [color=Red]beginTransaction();[/color]
try {
if (list != null) {
for (int i = 0; i < list.size(); i++) {
if (((JczdTpWt) list.get(i)).getNRybh() == userid) {
return "fail";<!-- [color=Red]问题就在这 事务没有正常关闭就退出了[/color]。-->
}
}
}
JczdDa jczdDa = dao.getDaById(daid);
jczdDa.setNTpsl(jczdDa.getNTpsl() + 1);
dao.updateDa(jczdDa);
。。。省略
[color=Red]getTransactionManager().commit(status);[/color]
session由 spring的工厂BEAN 址 org.springframework.orm.hibernate3.LocalSessionFactoryBean生成。
当事务打开的时候,会去线程的上下文LocalThread中找SessionHolder,如果没有找到就打开一个新的Session。包装好,放到LocalThread中去。
当事务关闭的时候,会把LocalThread中的对象清空,当前线程持有的Session关闭。
(spring中由TransactionSynchronizationManager维护当前线程的session 及事务信息)
如果事务没有关闭,会导致session一直在当前线程的LocalThread中。当下次请求到过中间件的时候,由于中间件有线程池,可能会从池中调用上次持有Session的线程
来处理新的请求,当Session要加载对象时,会从session级的缓存中查找,找到后就直接返回了,这时就看到原来的旧值。
使用spring的HibernateTemplate时,由于当前SESSION中存在事务,在执行完doInHibernate后并不会关闭session,由此会引起一系统的问题,比如session中缓存的对象会越来越多。
分享到:
相关推荐
Hibernate Session释放模式
hibernate中session对象的状态详解
Hibernate-nosession浅谈代码案例。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
No Hibernate Session bound to thread,没有绑定线程解决办法,找了好久才找到的
hibernate配置文件,session工厂学习,session链接数据库
可以对hibernate的 Session 和 Transaction 有更深入的认识 希望对一些概念比较模糊的人 有帮助
Hibernate 中对session的管理!
hibernate中session的管理描述。 hibernate中session的管理描述。
doc格式。Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、update的...其实这些概念都很简单,Hibernate的javadoc写的都很清楚,只需看看就能明白。
手写hibernate的session实现简单增删改查,适合新手学习hibernate
Hibernate_session_factory_配置
JAVA的hibernate手动获取session的方法
NULL 博文链接:https://former.iteye.com/blog/676665
主要介绍了hibernate关于session的关闭实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
hibernate session详细方法,值得珍藏
NULL 博文链接:https://selvemen.iteye.com/blog/457225
hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)
如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。值得注意的是,Session只有在清理缓存的...
Spring Hibernate 事务处理 详细说明 Spring Hibernate 事务处理 详细说明
hibernate5--2.数据持久化及事务