当前位置: 首页 > 知识库问答 >
问题:

Spring-@Transactional with ScheduledExecutorService-后台发生了什么?

严天逸
2023-03-14

我想知道当您用@Transactional和ScheduledExecutorService注释一个方法时,实际会发生什么?

假设methodA是从外部调用的。我假设调用methodA时,someDao.methodao()加入事务中,scheduleMethodB()立即返回,这是否正确。

我知道@Transactional是基于代理的,methodB调用也是基于scheduler下的self调用。

注意:由于此机制是基于代理的,因此只有通过代理传入的“外部”方法调用才会被拦截。这意味着“自调用”,即目标对象内的一个方法调用目标对象的某个其他方法,即使调用的方法被标记为@transactional也不会在运行时导致实际的事务!

public class ServiceABImpl implements ServiceAB {

    @Autowired
    private ScheduledExecutorService scheduledExecutorService;

    @Transactional
    public void methodA() {

        //do some work in a transaction.
        someDao.methodDao();

        //schedule a methodB
        scheduleMethodB();


    }

    public void scheduleMethodB() {

        scheduledExecutorService.schedule(() -> {
                    this.methodB();
                    return "";

                },
                2,
                TimeUnit.SECONDS);
    }

    @Transactional
    public void methodB() {


    }

}

共有1个答案

凌博实
2023-03-14

因为类没有用@Transactional注释,所以决定调用的方法是否参与父调用方法的事务取决于您是否也用@Transactional注释调用的方法,以及我认为您用什么传播级别配置它。所以举个例子

@Transactional(propagation=Propagation.REQUIRED)
 类似资料:
  • 问题内容: 我想知道当你使用注释方法时实际发生了什么?当然,我知道Spring将把该方法包装在Transaction中。 但是,我有以下疑问: 听说Spring创建了代理类?有人可以更深入地解释这一点。该代理类中实际包含什么?实际班级会怎样?我怎么能看到Spring创建的代理类 我还在Spring文档中读到: 注意:由于此机制基于代理,因此仅会拦截通过代理传入的“外部”方法调用。这意味着“自调用”

  • 观察:我在Polymer中运行一个SPA,当我在chrome中的新后台选项卡中打开内部链接时,页面直到我关注该选项卡才完成加载(ajax和所有页面)。 问题:chrome在等待用户焦点做什么?或者,Polymer在完成页面渲染和发送ajax请求之前在等待什么? 奖励:我如何打开一个开发工具面板,目标是我在后台打开的标签,以观察发生了什么/没有发生什么? 额外的回答:如果你在一个选项卡上打开开发工具

  • 问题内容: 早期的javadoc 这样表示有一个接口,它似乎有一个同样的关系作为必须的。 现在看来,我们固守在,这肯定是不一样的。 发生了什么事? 问题答案: 它已被删除前一段时间。布赖恩·格茨(Brian Goetz)提出了撤职的理由: 当前,唯一的实现者是Collection,所有其他支持流的方法都使用一种比“ stream”更合适的方法名称来提供特殊的流(chars(),codePoints

  • 本文向大家介绍Python实例一个类背后发生了什么,包括了Python实例一个类背后发生了什么的使用技巧和注意事项,需要的朋友参考一下 首先来看一个例子,正常情况下我们定义并且实例一个类如下 上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。 print type(obj) # 输出: Foo 表示,

  • 我已经部署了一个war文件,该文件由spring boot应用程序使用oauth2生成,用于使用Azure应用程序服务(仅限https)进行单点登录。 当我浏览到主页时,主页会加载一个登录按钮。在点击登录按钮时,发生了重定向到超文本传输协议://....../登录(/登录是默认的sso登录路径)由于我的应用程序服务是https而已,超文本传输协议url不工作。 我尝试了application.pr