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();
}
呀。
是啊,也是这样用,在业务层这样用,即在添加了事务的那一层这样抛出