[color=red][b]1.考虑有下面这么一个类[/b][/color]
Spring之所以可以对开启@Transactional的方法进行事务管理,[b][size=medium][color=red]是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。 [/color][/size][/b]
但是,上面这种调用方式时,在调用baz()时,使用的并不是代理对象,从而导致this.bar()时也不是代码对象,从而导致@Transactional失败。
非事务声明方法调用事务声明方法,则事务失效。使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。[size=medium][color=red][b]比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)[/b][/color][/size]
[size=medium][color=red][b]2.rollbackFor属性[/b][/color][/size]
默认情况下,在遇到运行时异常和Error,Spring事务会进行回滚,而遇到非运行时异常Exception则不会回滚
可以通过rollbackFor指定需要回滚的受检查异常,[color=red][b]指定异常之后rollbackFor=Exception.class,被指定的异常和该异常的子类都会得到回滚,并且运行时异常和Error异常仍然会得到回滚。[/b][/color]
public class Foo {
@Transactional
public void bar() { /* … */ }
public void baz() {
this.bar();
}
}
Spring之所以可以对开启@Transactional的方法进行事务管理,[b][size=medium][color=red]是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。 [/color][/size][/b]
但是,上面这种调用方式时,在调用baz()时,使用的并不是代理对象,从而导致this.bar()时也不是代码对象,从而导致@Transactional失败。
非事务声明方法调用事务声明方法,则事务失效。使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。[size=medium][color=red][b]比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)[/b][/color][/size]
[size=medium][color=red][b]2.rollbackFor属性[/b][/color][/size]
默认情况下,在遇到运行时异常和Error,Spring事务会进行回滚,而遇到非运行时异常Exception则不会回滚
可以通过rollbackFor指定需要回滚的受检查异常,[color=red][b]指定异常之后rollbackFor=Exception.class,被指定的异常和该异常的子类都会得到回滚,并且运行时异常和Error异常仍然会得到回滚。[/b][/color]