解决方案 »

  1.   

    事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从A账户转账到B账户,那么A的钱少了,B的钱多了同样的数字,它分了2个步骤去完成,如果第一步成功了,但第二步失败了,这时候A账户凭少了钱,而B账户没收到钱,那钱哪儿去了?为了解决这个问题,数据库中就有事务这个功能,当2个步骤全部成功时提交事务(把刚才的修改落实了),如果任意一个步骤失败了,就把刚才作的修改全部撤销。你上面的 spring 配置中说明了。第1个是说当方法名是 delete 开头是需要开启事务,收到 RuntimeException 不回滚,其它 Exception 及其子类的异常要回滚。
    insert 和 update 有类似的意思,不过你配置的需要试验一下,不要让rollback-for 和 no-rollback-for 互相矛盾(我本人不知道它们矛盾时谁的优先级更高)。            
    <tx:method name="delete*" propagation="REQUIRED" read-only="false"
                    rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException" />
                <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                    rollback-for="java.lang.RuntimeException" />
                <tx:method name="update*" propagation="REQUIRED" read-only="false"
                    rollback-for="java.lang.Exception" />
      

  2.   

    没开事务照样保存成功的,那是因为,没开事务等同于每条SQL一个事务,当你有多个SQL 在执行时,那么程序就会停在第一个出错的地方,前面的已经提交了,后面的就终止了,因此这个时候的数据库的数据的状态彼此之间就不一致,就好像刚才说的,A账户少了钱,但B账户没有多出那么多钱来,这就是错误。
      

  3.   

    那请问,如果我不开启事务, 一条sql批处理 一大堆数据, 运行中 某条异常, 那我 异常前的会回滚吗?
      

  4.   

    我试过了,不会~,  那岂不是我 用mybatis 免dao实现的方法,用不着配置这个?
      

  5.   

    你有定义update*但是没有定义refesh*你用refeshUser当然没用啦
    回滚是必须是一个错误就全部回滚的,这才是事务啊
      

  6.   

    觉得你这样配置很麻烦、<tx.../>
    <aop..>都配置了吗?