@Transactional注意事项
1. @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
2. 默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如果让checked异常回滚, 还可以在异常捕获时再次抛出
注意: 如果异常在service层被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
3. @Transactional 注解应该只被应用到 public 可见度的方法上
4. 建议是在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上
5. 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。
6. 实际上事务本身是针对连接来说的,因此一个连接可能会多次进行事务操作,但是一个事务只连接一次数据库,无论有多少条数据库操作,也无论这些操作是不是select,insert,update等复合起来的
一个事务对应一个连接,必须在指定的数据库连接下进行事务处理。如果再次连接数据库,需要重新建立事务处理
7. 在一个事务中, 不管代码顺序如何, 都是先读后写(貌似不是这样了)
8. 一个事务中启动一个新线程, 该新线程是一个独立事务

浙公网安备 33010602011771号