本帖最后由 findhappy7 于 2010-04-21 13:59:58 编辑

解决方案 »

  1.   

    如果会触发事务,因为出现异常,那么这个事务应该会有一个事务开始,和事务回滚吧?那怎样回滚?spring的事务回滚又会发什么?
      

  2.   

    这个源码没研究
    我的理解:
    你为这个方法声明了事务,哪他进入这个方法匹配了,那就开始事务
    遇见EXCEPETION了,事务就回滚
    回滚的时候发现没有找到回滚点,
    哪我不管了呗所以我说你这样意义何在?
      

  3.   

    怎样知道其开始了 事务了? debug信息好像没有,,,
      

  4.   

    我遇到一个这样一个问题:
    ---------------------------------------------
    A.runSQL() 加上事务声明后,但发生异常后,触发了事务回滚,runSQL这个方法是有dataSource注入的,继承org.springframework.jdbc.core.support.JdbcDaoSupport这类然后我 A.runSQL()不加上事务声明,,,然后被添加到一个业务方法里面,,这个业务方法,没有数据库连接、数据源等的属性,,但这个业务方法加上了 事务声明,,,然后运行这个业务方法,发生异常的时候,却没有出现事务回滚的,,,,
      

  5.   

    你的意思是在有事务控制的业务方法里调用A.runSQL,出现异常,没有回滚?
      

  6.   

    下面是仿 spring aop做的! 一看你就知道他是怎么样控制了public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    Long start = System.currentTimeMillis();
    System.out.println("***************业务方法开始执行" + method.getName());
    Logger logger = Logger.getLogger(method.getClass());
    Object returnValue = null;
    try {
    // 开始事务
    // HibernateSessionFactory.getSession().beginTransaction(); // 执行业务方法
    returnValue = method.invoke(serviceObject, args);

    // hibernate业控制事务
     HibernateSessionFactory.getSession().getTransaction().commit(); } catch (Exception e) {
     HibernateSessionFactory.getSession().getTransaction().rollback(); 
    // 如果有异常就回滚
    e.printStackTrace();
    } Long end = System.currentTimeMillis();
    Long result = end - start;
    System.out.println("***************业务方法执行结束" + method.getName());
    System.out.println("方法用时" + result);
    return returnValue; }
      

  7.   


    是的,,郁闷死
    ---------------------
    单单在A.runSQL里面加上事务声明,则log4j调为debug下
    打印:
    2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@f22777]>
    2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Creating new transaction with name [com.cellcom.bizlets.database.component.Processor.execute]>
    2010-04-21 14:32:54,921 DEBUG [org.hibernate.impl.SessionImpl] - <opened session at timestamp: 12718315749>
    2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Opened new Session [org.hibernate.impl.SessionImpl@1fd2a6e] for Hibernate transaction>

    上面这些清楚的显示了创建事务的过程,,
    但 只是  在业务方法里面加上声明事务,则没有上面的过程,,郁闷中