spring 事务 不能rollback的问题终于解决了 spring 事务 不能rollback的问题终于解决了

项目中虽然配置了事务,但是总感觉没起作用。

尤其是我在测试service方法时,总是报出一个异常  transaction not successfully started .

我开始以为是事务配置的问题,经过反复的检查,发现没错。

 

开始在网上漫无目的的搜索解决方案, 在一片帖子中看到,有人说 使用SessionFactory.getCurrentSession爆出了这个异常,解决办法是改为 SessionFactory.openSession() ,这个倒是给了我灵感。

于是我去检查 hibernateDao(项目中封装的唯一dao),结果发现 session 都是通过 HibernateDaoSupport.getSession() 得到的,而save,update,delete 等是通过get HibernateTemplate() 来实现的,根本没有涉及到 SessionFactory.本来已经放弃这个方法了。一不小心在 save方法中发现了一行代码

this.getSession().beginTransaction().commit();  

当时就震惊了,这句话根本就没用嘛,估计以前没配置事务时 自己写着玩的。赶紧把这个注掉,又在 commit()方法中发现了这行代码,注掉。 

 然后运行测试,通过了,事务正常回滚了。

总结一下,在spring使用了声明式事务 ,就不应该在 拦截的 类中 自己维护事务。

项目中虽然配置了事务,但是总感觉没起作用。

尤其是我在测试service方法时,总是报出一个异常  transaction not successfully started .

我开始以为是事务配置的问题,经过反复的检查,发现没错。

 

开始在网上漫无目的的搜索解决方案, 在一片帖子中看到,有人说 使用SessionFactory.getCurrentSession爆出了这个异常,解决办法是改为 SessionFactory.openSession() ,这个倒是给了我灵感。

于是我去检查 hibernateDao(项目中封装的唯一dao),结果发现 session 都是通过 HibernateDaoSupport.getSession() 得到的,而save,update,delete 等是通过get HibernateTemplate() 来实现的,根本没有涉及到 SessionFactory.本来已经放弃这个方法了。一不小心在 save方法中发现了一行代码

this.getSession().beginTransaction().commit();  

当时就震惊了,这句话根本就没用嘛,估计以前没配置事务时 自己写着玩的。赶紧把这个注掉,又在 commit()方法中发现了这行代码,注掉。 

 然后运行测试,通过了,事务正常回滚了。

总结一下,在spring使用了声明式事务 ,就不应该在 拦截的 类中 自己维护事务。

猜你喜欢

转载自rongdmmap-126-com.iteye.com/blog/1410411