日期:2014-05-20  浏览次数:20714 次

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 (应该是这么写吧),