这是在深入浅出mybatis里看到的,研究一下事务的传播机制。
事务自调用问题:同一方法中如果出现调用自己的方法是无效的,因为spring的数据库事务是在动态代理进入到一个invoke方法里面的,然后判断是否需要拦截方法,需要的时候才会根据注解配置数据库上下文,这里的方法是自调用的,也就没有所谓的代理对象,所以无效。
事物的回滚方式:spring默认只接受RuntimeException和Error,需要自己定义异常回滚机制,可以在Transaction定义rollback。
/** * The default behavior is as with EJB: rollback on unchecked exception. * Additionally attempt to rollback on Error. *
This is consistent with TransactionTemplate's default behavior.
*/
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
网友评论