ApplicationContext.xml:
- Java code
<!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
Service层:
- Java code
@Transactional(rollbackFor = Exception.class)public void saveActivity(Activity activity) throws Exception { tripsDao.updateTrips(28); if (1 == 1) throw new Exception("xxxxxxx");}
问题:
updateTrips这个方法是HQL语句,没有回滚事务
- Java code
getSession().createQuery("update Trips ts set ts.tstate = '1' where ts.tripsid = ? and ts.ttype = 1") .setParameter(0, 28).executeUpdate();
updateTrips这个方法是直接修改对象,回滚了事务
[code=Java]
getSession().saveOrUpdate(trips);[code]
各位大大帮帮忙解释下为什么呢?
------解决方案--------------------
你用spring管理了事务,你的提交都有它去处理了,典型的像save,update,delete的操作,说白了就是你数据库中的数据要发生变化,那就要为你的方法进行配置,也就是说要在spring中配置。
如果你的save。update,delete语句在插入或者修改或者删除时出现了错误,那spring便会为你去把事务回滚,这个过程你是看不到的。
我只能说这么多了,你现在的问题没有说明白,说明白在让大伙帮你解决吧,我这里只是为你提个醒
------解决方案--------------------
配置spring的时候,要配置一下,含有哪些关键字的需要回滚,就可以啦
------解决方案--------------------
getSession().createQuery().executeUpdate();这里spring AOP使executeUpdate执行的时候,先创建一个事务,执行完方法后再提交事务,所以你不需要提交事务也能更新操作,因为spring AOP已经帮你提交了
------解决方案--------------------
事务传播特性···
------解决方案--------------------
你的异常怎么处理的~~~!!!
你的dao底层要抛出给Service啊!
然后你Spring监控Serivce里面的方法、!
如果出错了它就给你回滚事务~~~!!!
如果你dao底层没有将异常抛出、Service捕获不到、也就是没有异常!
没有异常就不会给你回滚了!
也不知道说的对不对!
将就看吧!
------解决方案--------------------
用try{
}catch(){
}异常就回滚了- -!!
------解决方案--------------------
1 Exception 首先 Hibernate 是不回滚这种异常的,它只回滚 RuntimeException .
2 没看到你写aop的 active (应该是这么写吧),