我在测试事务是不是回滚的时候,我这样写的代码
我在业务层的一个方法中加了这2行代码
frameSubsysDAO.update(frameSubsys);
throw new RuntimeException("aaaaaa"); 
这个方法我没有用
try cathc{} 而
frameSubsysDAO.update(frameSubsys);调用的dao方法是这样写的 public void update(Object instance)
    {
        log.debug("update instance");
        try
        {
            getHibernateTemplate().update(instance);
            log.debug("update successful");
        }
        catch(RuntimeException e)
        {
            log.error("update failed", e);
            throw e;
        }
    }
我怀疑这里因为加了
try  catch{}才导致事务不能回滚,请问是不是哦?

解决方案 »

  1.   

    用Spring管理事务你要进行配置,首先确认你是否配置了事务,比如在XML中配置或者用@Transactional注释等等,另你try catch了异常要抛出来。。给你个例子参考一下吧:
    http://blog.csdn.net/kuangmiao1120/archive/2008/05/29/2493776.aspx
      

  2.   

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="insert*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="delete*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="update*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="exchange*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="*" read-only="true" propagation="SUPPORTS" />
    </tx:attributes>
    </tx:advice>
    <!--
    配置那些类的方法进行事务管理,当前net.omw.flow.bo.impl包中的子包, 类中所有方法需要,还需要参考tx:advice的设置
    -->
    <aop:config>
    <aop:pointcut id="allManagerMethod"
    expression="execution(*  
      net.omw.flow.bo.impl.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
    </aop:config>
    <bean id="powerMessage" class="net.omw.pub.manager.PropertiesManager">
    <property name="resource">
    <value>/WEB-INF/classes/power.properties</value>
    </property>
    </bean>
    这是我配置的事务
    我现在就是回滚不了,我现在就是怀疑是不是
     public void update(Object instance)
      {
      log.debug("update instance");
      try
      {
      getHibernateTemplate().update(instance);
      log.debug("update successful");
      }
      catch(RuntimeException e)
      {
      log.error("update failed", e);
      throw e;
      }
      }
    加了try  catch{}
    的缘故
      

  3.   

    从我的配置来看,我把事务配置在service层的,因此我在service层中,其方法中没有加try catch
    但是我在dao层加了try catch
    我想问下,是不是这个地方出了错误哦?
      

  4.   

    应该不是,你try catch后将方法抛出了,你在看看你的配置文件,如果你用Spring管理事务,你看看你的配置文件中SessionFactory是不是Spring创建的,用的是谁的实现?
      

  5.   

    怎么说?我不是配置了事务了呀
    tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="insert*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="delete*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="update*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="exchange*" read-only="false" propagation="REQUIRED"
    isolation="SERIALIZABLE" />
    <tx:method name="*" read-only="true" propagation="SUPPORTS" />
    </tx:attributes>
    </tx:advice>
    <!--
    配置那些类的方法进行事务管理,当前net.omw.flow.bo.impl包中的子包, 类中所有方法需要,还需要参考tx:advice的设置
    -->
    <aop:config>
    <aop:pointcut id="allManagerMethod"
    expression="execution(*   
      net.omw.flow.bo.impl.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
    </aop:config>
    我事务-配置在业务层的
    frameSubsysDAO.update(frameSubsys);
    throw new RuntimeException("aaaaaa");  
    这两行代码也是在业务层呀
    按理说,程序运行到
    throw new RuntimeException("aaaaaa");会抛异常
    导致事务回滚,数据不会被更新,但是,我现在的情况是数据被更新了,不符合我的愿望哦
      

  6.   

    还有,我用的是sqlserver2000,会不会和数据库有关系?
      

  7.   

    不能说事务跟数据库无关。
    据我所知,mysql的诸多存储引擎中,就有好几个是不支持事务的。
    一般支持事务的数据库,rollback和commit都是事务的基本操作,应该都支持的。