@Async异步方法的使用+ @Transactional事务处理

时间:2024-03-22 16:54:36

有的时候某些方法或业务需要使用异步来执行这样更节约时间

那么今天翔童鞋来总结下我使用的经验,不足之处多多指教,欢迎评论!!

首先要把异步执行的方法最好是单独提出来形成一个类在类中编写你的方法,可以在要异步的方法上添加@Async注解表示要异步执行的方法,也可以在这个类的头上加上@Async这个注解,但是这样的话就表示这个类中的所有的方法就都是异步执行的,那么这个类中的方法就会出现异步方法中调用异步方法.所以我建议还是在将要执行异步的方法上添加注解

小翔我就是在方法上添加注解

@Async异步方法的使用+ @Transactional事务处理

那么还有一个点要注意的是,你定义的这个类必须要注入到spring容器中成为spring的一个Bean,所以要加上@Component,否则的话在执行的时候会找不到这个类哦!!

这样就可以愉快地异步节省时间了!!!----然而

当你执行的时候会发现 -_-!! 好像没什么变化嘛,,异步也不过如此!!  其实--你知道吗 你根本就没有执行异步(小翔大声的说~~~)

我们需要在主启动类上添加注解@EnableAsync 开启异步  此时才是走向异步的时刻!!!

所以注意在使用异步的时候:

1.单独提出的类要成为spring的Bean 一定要加注解@Component

2.在主启动类上添加注解@EnableAsync开启异步时刻

异步与事务结合使用:

我们在执行业务时要保证一致性,原子性....

那么就需要添加@Transactional事务处理,遇到异常执行回滚处理,

举个栗子(举个锤子!!O(∩_∩)O哈哈~)两个方法A,B

现在A方法调用B方法,为了效率,B方法实行异步,为了保证数据的一致性,原子性...

以下几种情况结果:

1.给A方法上添加了@Transactional事务,B方法上没有添加,

那么此时执行时A抛出了异常(记住B是异步的),那么A中执行的业务全部回滚,而B中没有发生回滚.

AB都异常只有A回滚

B异常,A正常执行,B异常结束不发生回滚

2.给A,B方法上都添加了@Transactional事务:

此时A异常了 那么A发生了回滚,,B正常执行

只有B异常,A正常执行B发生了回滚

 

所以小翔提醒你注意事务的使用哦!!!

对了 使用异步就相当于是多个线程执行,如果A方法执行过程中调用B方法,B方法执行完A方法才执行完,这是单线程,那么为了节约时间B方法为异步也就是同一时间干了两件事情,这就是多个线程操作.

结论:不同线程之间的事务完全隔离,异步线程内仍是可以调用异步~(详情可以查看https://blog.csdn.net/f641385712/article/details/98642777)