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

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

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

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

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

那么还有一个点要注意的是,你定义的这个类必须要注入到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)

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Spring框架中,使用@Async注解可以将一个方法标记为异步执行,该方法会在一个新的线程中执行。而@Transactional注解用于开启事务,用于保证数据的一致性。 当一个被@Async注解的方法调用一个被@Transactional注解的方法时,会出现事务失效的情况。这是因为@Transactional注解只能在当前线程中开启事务,而异步方法是在新的线程中执行的,与当前线程不在同一个线程中,因此无法获取当前线程中的事务上下文。 为了解决这个问题,可以使用Spring提供的异步事务处理机制。具体来说,可以在@Async注解的方法添加@Transaction注解,并设置propagation属性为REQUIRES_NEW,表示开启一个新的事务。这样,在异步方法中执行的数据库操作就可以在新的事务中进行,不会影响到当前线程中的事务。 举个例子: ``` @Service public class UserService { @Autowired private UserRepository userRepository; @Async @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateUser(User user) { userRepository.save(user); } } ``` 在上述例子中,updateUser方法使用了@Async和@Transactional注解,@Async注解表示该方法异步执行的,@Transactional注解中设置propagation属性为REQUIRES_NEW,表示开启一个新的事务。 总之,为了避免@Async修饰的方法@Transactional事务失效,需要在异步方法使用@Transaction注解开启一个新的事务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值