Spring 交易创建

Spring transaction creation

这个问题是在一次采访中被问到的

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 proxy 的工作原理,谁能解释一下这部分?

这个程序可以重写为:

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() 方法:

 var a = context.getBean(A.class);
 a.test1()

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

来自 Spring 文档:

However, once the call has finally reached the target object any method calls that it may make on itself, such as this.bar() or this.foo(), are going to be invoked against the this reference, and not the proxy

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

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

 var b = context.getBean(B.class);
 b.test1()

因为BA的subclass并且A注解了Transactional,所以B本身就是一个proxy(@Transactional是自动即使 B 中的 test1() 没有用 @Transactional 注释也是如此)。因此将创建一个事务。当我们到达目标对象时,所有交易内容都会消失,并且不会像第一种情况那样创建更多交易。