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

从同一个bean调用transactional.txtype.requires_new时是否启动新事务?

班承恩
2023-03-14
@Service
public class SomeService {
    
    @Transactional
    public void doSomeLogic() {
        // some logic
        doOtherThings();
        // some logic
    }

    @Transactional(Transactional.TxType.REQUIRES_NEW)
    private void doOtherThings() {
        // some logic
    }

共有1个答案

郭兴平
2023-03-14

为了得到这个问题的答案,您需要知道代理是如何工作的。

当您在bean中注释一个方法时,代理将用适当的逻辑包装该bean。这意味着,如果调用bean的带注释的方法,请求将首先发送到代理对象(命名为$),然后代理对象调用bean的方法。如果这个方法调用同一个bean的另一个方法,它将调用它而不调用具有事务管理逻辑的代理。

示例:下面是将由代理包装的代码及其工作的适当图表。

@Service
public class SomeService {

    @Transactional
    public void foo() {
        // this next method invocation is a direct call on the 'this' reference
        bar();
    }
    
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public void bar() {
        // some logic...
    }
}
 类似资料:
  • 问题内容: 我们有: MyInterface有一个方法:。 当go()执行时,我们开始一个新的事务,该事务在方法完成时进行提交/回滚-很好。 现在,在go()中,我们在MyClass中调用了具有的私有方法。看来Spring会“忽略” REQUIRES_NEW批注,并且不会启动新的事务。我相信这是因为Spring AOP在接口级别(MyInterface)上运行,并且不会拦截对MyClass方法的任

  • 问题内容: 从同一bean的另一个方法调用缓存的方法时,Spring缓存不起作用。 这是一个示例,可以清楚地说明我的问题。 组态: 缓存的服务: 结果: 该方法调用使用缓存在第二次调用预期。但是,在类中()中调用该方法时,则未使用Cache。 这是Spring缓存的工作方式还是我缺少什么? 问题答案: 我相信这是这样的。从我记得阅读的内容来看,生成了一个代理类,该代理类可以拦截所有请求并使用缓存的

  • 我有一个应用程序的屏幕小部件。单击此小部件时,会打开“DeveloperMode”设置。但在一些设备上,应用程序因以下消息而崩溃。 引起:android.util.AndroidRuntimeExcture:从活动上下文外部调用starActive()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗? 我曾尝试使用addFlags和setFlags添加这一行,但仍然存在相同

  • 问题内容: 如果一个同步方法调用另一个同步方法,那么线程安全吗? 问题答案: 是的,将方法标记为时,您实际上是在这样做: 当线程调用从method1进入method2时,它将确保它持有对的锁定,该锁定已经存在,然后可以通过。 当线程直接进入method1或method2时,它将阻塞直到获得锁(),然后进入。 正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操

  • 我有一个注册了ActionListener的JTextField。当这个JTextField有焦点时,按下enter键,就会创建一个ActionEvent。 如何将此事件链接到另一个组件ActionListener(如JButton),以便运行其代码?

  • 我的车型带有bean验证 汽车服务 } 当我从控制器Valid调用addCar时工作正常,但是当我从同一个服务类中的方法调用它时,它不验证汽车模型。 我从控制器调用addCars 这个怎么解决?我应该做些什么来使它工作呢?我必须对代码进行哪些更改?