- @Transactional只有加在public 声明的方法时才起作用。
- @Tansactional声明的方法调用A,调用无@Tansactional声明的方法B时,在A方法执行时,B也会有事务回滚的特性。
- 无@Tansactional声明的方法A,调用@Tansactional声明的方法B,事务将不起作用
class XService {
public void a(){
this.a(); //或者直接a();效果是一样的
}
@Transactional
private void b(){
//do sql statement
}
}
如何查看是否启动了Transaction?
设置log leve为debug,可以查看是否有下面这个log,判断是否启动了Transaction:
DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name…
注解不会生效,原因:spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。
参考:https://blog.youkuaiyun.com/clementad/article/details/47339519