繁体   English   中英

Spring @Transactional方法 - 参与交易

[英]Spring @Transactional method - participating transaction

在一个dao我有2个@Transactional方法。

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

那么会发生什么,如果

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

这两种方法都在同一个交易中运行?

Spring AOP中的代理

使用Transactional时,您正在处理类的代理,因此在这种情况下:

@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代理一章中得到了很好的解释,包括这个“解决方案”:

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

public class SimplePojo implements Pojo {

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

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

@Transactionalpropagation属性的默认值是REQUIRED ,这意味着:

支持当前事务,如果不存在则创建新事务。

所以是的 - 两种方法都将在同一个事务中运行。

但是一个重要的建议是: 不要让你的DAO交易 服务应该是交易性的,而不是DAO。

春天的文件

一个说明:

在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。 这意味着实际上,自调用目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM