@Transactional的使用
使用方法
1.使用接口或者接口方法上,AOP必须是jdk动态代理(不推荐)
2.可以使用到类或者类方法上(推荐)
3.注解应该只应放在public方法上,其他级别(protected,private无效)
4.只有来自外部的方法调用,事务才会生效。
①(生效)
@Transactional
public void A(){
B();
}
public void B(){
...
}
②(不生效)
public void A(){
B();
}
@Transactional
public void B(){
...
}
③(生效)
@Transactional
public void A(){
B();
}
@Transactional
public void B(){
...
}
④(生效)
@Transactional
public void A(){
dao.B();
}
@component
public void B(){
...
}
回滚控制
1.默认配置下,方法体只有在抛出RuntimeException或其子类时,才回滚事务。
2.可以指定哪些异常回滚:
@Transactional(rollbackFor=XXXException.class)
2.可以指定哪些异常不回滚:
@Transactional(noRollbackFor=XXXException.class)
@Async的使用
@Async使用与@transactional类似
注意:如下方式会使@Async失效
一、异步方法使用static修饰
二、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
三、异步方法不能与异步方法在同一个类中
四、类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
五、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解
六、在Async 方法上标注@Transactional是没用的。 在Async 方法调用的方法上标注@Transactional 有效。
七、调用被@Async标记的方法的调用者不能和被调用的方法在同一类中不然不会起作用!!!!!!!
八、使用@Async时要求是不能有返回值的不然会报错的 因为异步要求是不关心结果的