HQL 语句事务没有回滚
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 (应该是这么写吧),