@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. 一个事务中启动一个新线程, 该新线程是一个独立事务

posted @ 2018-02-24 17:28  車輪の唄  阅读(26)  评论(0)    收藏  举报  来源