首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务创建

Spring事务创建
EN

Stack Overflow用户
提问于 2022-04-28 16:57:25
回答 1查看 82关注 0票数 1

这个问题是在一次采访中问我的。

代码语言:javascript
复制
class A{
   @Transactional
   public void test1(){
      test2();
   }

    @Transactional(propagation = REQUIRED.NEW)
    public void test2(){}


class B extends A{

   public void test1(){
      super.test1();
     }

他问我要创建多少事务对象?答案是1,而不是2。现在我很难与这部分作斗争。他说这就是CgLib代理的工作方式,有人能解释一下这个部分吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 21:48:51

这个程序可以重写如下:

代码语言:javascript
复制
class A{
   @Transactional
   public void test1(){
      this.test2(); // this is added
   }

    @Transactional(propagation = REQUIRED.NEW)
    public void test2(){}


class B extends A{

   public void test1(){
      super.test1();
     }

假设您从应用程序上下文中获得A,并对其调用test1()方法:

代码语言:javascript
复制
 var a = context.getBean(A.class);
 a.test1()

我们知道a实际上是代理对象,因此将创建一个事务。在test1()方法中,我们称之为this.test2()方法。

Spring:

但是,一旦调用最终到达目标对象,它可能对自己进行的任何方法调用(如this.bar()或this.foo() )都将针对该引用而不是对代理调用。

因此,对于test2()方法,不会创建任何事务,因为这是针对A类调用的,而不是所有事务性内容支持的代理类。

现在假设您从应用程序上下文中获取B,并对其调用test1()方法。

代码语言:javascript
复制
 var b = context.getBean(B.class);
 b.test1()

因为BA的子类,而A是使用事务处理进行注释的,所以B本身是一个代理(即使B中的test1()没有用@Transactional注释,但test1()是自动继承的)。因此,将创建一个事务。当我们到达目标对象时,所有事务都会消失,不会像第一种情况那样创建更多的事务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72047587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档