@Transactional注解和@Async注解无效

一:@Async

        springboot想要使用异步处理的时候,我们会使用到@Async注解,表明某个方法为异步调用,我们需要使用@EnableAsync开启异步调用。

但是有时候明明加了这两个注解,异步确没有起作用,我在开发中也遇到了这个问题,结果查阅资料发现调用异步的方法和异步方法不能在同一个类中,下面例子

@Test

public void TestAsync()throws InterruptedException {

    System.out.println("开始");

    testService.async();

    //async();这里调用同类中的async()不会起作用

    System.out.println("结束");

    Thread.sleep(5000);

}@Async

public void async(){

    try {

    System.out.println("async start");

    Thread.sleep(2000);

    System.out.println("async end");

}catch (InterruptedException e) {

    e.printStackTrace();

}

}


二:@Transactional

使用@Transactional时,有几点需要注意:

    1)、必须保证这个注解修饰的方法是public方法

    2)、想要异常回滚,必须是非检查异常,即不用try-catch包裹,除非手动指明回滚类型rollbackFor=Exception.class

    3)、调用事务的方法必须和事务方法不在同一个类中

具体原因是springboot使用@Transactional注解和@Async注解的时候是使用代理模式,jdk代理或者是cglib代理需要被实现或者继承,所以必须是public方法,并且在同一类中方法在类体中执行,没法截获方法调用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DAY 05 1、 public classArrayDemo { public static void mai...
    周书达阅读 4,046评论 0 0
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 4,858评论 1 0
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 10,148评论 1 114
  • 生活中,我们偶尔会冒出一些“无聊”的情绪。觉得没什么事情可做,觉得自己刚刚做的事情很没劲,会坐着发呆,会想随便做...
    StarrySky阅读 2,905评论 0 1
  • 原理简述 单管道后门相对于双管道后门(参照前面发的Blog),很明显单管道后门使用了“cmd.exe /c [命令...
    PeterZ1997阅读 3,408评论 0 0