当前位置: 首页 > 面试题库 >

Spring @Transactional方法-参与交易

郤仰岳
2023-03-14
问题内容

在一个岛中,我有2个@Transactional方法。

如果我不提供任何明确的属性,

那会发生什么,如果

我在另一种体内运行一种方法?

两种方法都可以在同一交易中运行吗?


问题答案:

春季AOP中的代理

使用事务性时,您要处理类的代理,因此在这种情况下:

@Transactional
public void doSomeThing(){ // calling this method targets a proxy

    doSomeThingElse(); // this method targets the actual class, not the PROXY,
                       // so the transactional annotation has no effect
}

@Transactional
public void doSomeThingElse(){
}

您从外部调用代理,但是第二个方法调用是从代理对象内部进行的,因此没有事务支持。所以自然地,它们运行在同一事务中,无论第二种方法中@Transactional批注的值是多少

因此,如果您需要单独的交易,则必须致电

yourservice.doSomething();
yourservice.doSomethingElse();

从外面。

整个场景在 **[Spring AOP

了解AOP代理](http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/aop.html#aop-understanding-aop-
proxies)**(包括此“解决方案”)一章中得到了很好的解释:

从内部访问当前AOP代理对象

public class SimplePojo implements Pojo {

   public void foo() {
      // this works, but... gah!
      ((Pojo) AopContext.currentProxy()).bar();
   }

   public void bar() {
      // some logic...
   }
}


 类似资料:
  • 我的springboot控制器中有@async方法,它调用service method(async)并执行一些DB事务。当这个控制器@async方法被多次调用而没有时间延迟时,它会导致org.hibernate.exception.JDBCConnectionException:无法获取JDBC连接 控制器 服务 然后调用同一服务类中的sendSingleMessage方法,其中调用NOT跨国方法

  • 由于此错误,以前的提交被回滚,但它不应该回滚。 不确定导致此回滚的原因。

  • 我正在使用Hibernate Envers来持久化对象历史。在某些情况下,我们希望捕获对象图状态的快照—我们可以通过了解相应的Envers修订版来实现这一点,然后将其存储在审计记录中。 然而,我们有一个问题。父对象在我们创建和存储其子审核记录的同一事务中更新,并使用Envers revision完成。我们可以获得最新版本: 或创建新修订: 并且使用其中一个,但是父级的提交总是在这之后发生。这就是E

  • 我正在使用带有webflux的spring boot 2.4.2连接到postgres数据库。我在使用事务性代码时观察到了一个我不理解的行为。 为了展示这种行为,我创建了一个示例应用程序,试图将行添加到两个表中;表“a”和表“b”。对表“a”的插入预计将失败,并出现重复密钥冲突。考虑到使用了事务性,我希望不会向表“b”中添加任何行。 然而,根据我用哪个方法注释事务,我会得到不同的结果。 如果我对c

  • 问题内容: 我有一种将用于发送电子邮件的方法。我想锁定此方法,以便每次只有一个线程可以访问它,其余线程同时存储。我应该同步方法还是使用spring @transactional PROPAGATION_REQUIRED? 在我的服务层 问题答案: 为什么不通过不使用任何实例级别的东西使该方法成为线程安全的呢? 但是,我看不到Spring的事务管理如何适合这里。我的意思是Spring提供几个事务管理

  • 我有一个dao类(),它用annotaion(在类级别)标记,没有其他参数。在这个dao类中,我有一个方法,在某些情况下,它需要抛出一个已检查的异常并执行事务回滚。类似这样的事情: 这个很好用。但是,这个dao方法是从一个服务方法调用的,该服务方法也被标记为@transactional: 问题是,当从调用并将事务标记为仅回滚时,我会得到一个。 Spring创建了两个事务拦截器:一个用于,一个用于。