spring+ibatis事物配置问题为什么只有空指针才回滚,SQLException不回滚

transaction-manager="transactionManager">
tx:attributes




/tx:attributes
/tx:advice
aop:config
expression="execution(* *..services.impl.*Manager*.*(..))"
id="bankServicePc" />
pointcut-ref="bankServicePc" />
/aop:config

其实这就像Java中有那么多的扩展异常类一样,每种种异常类用于表示某种异常,一旦你看到Null...Exception你就知道是空指定异常, 这种要体会体会

只有Runtime异常才回滚事务,非运行时异常不回滚事务。

当事务运行过程中发生异常时,事务可以被声明为回滚或继续提交。
默认情况下,当发生运行期异常时,事务将被回滚,发生检查型异常时,既不回滚也不提交,控制权交给外层调用。

这种默认的回滚规则在大多数情况下是适用的。不过用户也可以通过配置显式指定回滚规则:
通过指定带正号(+)或负号(-)的异常类名(或异常名片断)。当抛出负号型异常时,将触发事务回滚,当抛出正号型异常时,即使这个异常是检查型异常,事务也会提交。抛出异常或其父类异常名匹配规则中指定的异常类名,规则就生效.如:

PROPAGATION_REQUIRED,-Exception
只要业务方法运行时抛出的异常或其父类异常的类名包括"Exception",事务就回滚,以下异常都符合这条规则:SQLException、ParseException

因为spring默认的事务回滚规则为:运行期异常回滚,检查型异常不回滚,所以带负号的异常设置仅对检查型异常有意义.

一般开发中都会定义一个扩展自RuntimeException的异常类,如BizException或BusinessException异常类,用在需要进行异常回滚的地方,然后配置:
rollback-for="...BizException"

性能方面没什么问题

建议可以像我上面所说的,扩展一个异常类,用来捕捉需要回滚的地方
[code="java"]
/**

  • 自定义异常类. 需回滚的方法发生异常时将抛出该异常
  • @author qiuzj
    *
    */
    @SuppressWarnings("serial")
    public class RollbackException extends RuntimeException {

    public RollbackException() {
    super();
    }

    public RollbackException(String message, Throwable cause) {
    super(message, cause);
    }

    public RollbackException(String message) {
    super(message);
    }

    public RollbackException(Throwable cause) {
    super(cause);
    }

}
[/code]

问题补充:
[color=red]zhanjia ,我想假如要扩展RuntimeException类,但是捕捉异常,还是在
(SQLException e) {
throw new RollbackException();
}
呀。


是啊,也是这样用,在业务层这样用,即在添加了事务的那一层这样抛出