Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链式事务api调用spring_Java_Spring_Jpa_Transactional - Fatal编程技术网

Java 链式事务api调用spring

Java 链式事务api调用spring,java,spring,jpa,transactional,Java,Spring,Jpa,Transactional,我有一个问题,我没有得到我的交易提交 我的服务类是@Transactional注释的 @Transactional class MyService{ public void find(); public void return(); //Return will only happen if find is updated in DB public void cancel(){ find(); return(); } } 我的类有3

我有一个问题,我没有得到我的交易提交

我的服务类是@Transactional注释的

@Transactional
class MyService{
   public void find();
   public void return(); //Return will only happen if find is updated in DB
   public void cancel(){
          find();
          return();
   }
}
我的类有3个api,它们在内部调用各自的Dao,Dao as不被注释为事务性的

现在,如果调用cancel,我将首先调用find,然后调用return()。但是return()需要find()需要用find status更新数据库

但是,由于在返回取消之前,所有事务都发生在同一事务上,因此不会提交事务。有人能帮我理解这种情况并解决它吗

我不知道在这种情况下如何使用传播


提前感谢。

来自Spring Transaction文档()

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


在cancel()方法中对find()和return()的调用不是事务性的。如果您希望它是事务性的,您可以执行类似于
applicationContext.getBean(this.getClass())的操作并调用您的方法。

从Spring Transaction文档()

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


在cancel()方法中对find()和return()的调用不是事务性的。如果您希望它是事务性的,您可以执行类似于
applicationContext.getBean(this.getClass())的操作并调用您的方法。

它们使用相同的事务,这意味着在同一事务本身中从事务调用的所有选择中都可以看到事务中所做的更改,即使find()更新了数据库,而我正在从return()检查我无法看到数据库已更新。它们使用相同的事务,这意味着在同一事务本身中从事务调用的所有选择中都可以看到事务中所做的更改,即使find()在我从return()检查时更新了数据库我无法看到数据库已更新。是否仍在使用传播为来自目标对象本身的每个调用启动新事务。如果像这样调用find(),则applicationContext.getBean(this.getClass())。find()spring将使用当前事务。您可以添加注释,要求在find()声明中添加新的内容,Spring将在每次调用时启动一个新事务。从同一个Bean调用内部的Bean是否安全。你能告诉我这是否会对我的系统造成间接影响吗。因为我从来没有做过这样的事情,而且这个项目非常关键,应该是一致的,所以我担心在bean中访问同一个bean,因为它本身工作得很好,谢谢你在这方面的帮助。接受这一点作为答案,让我知道在同一个bean中使用applicationContext使用bean的间接影响(如果有的话)。事实上,当你不得不做这种“把戏”时,它说明了你的体系结构中的一个问题。也许您的服务层应该被重新组织,或者您应该添加一个编排层,或者注意到一些无用的层除了调用另一个层之外什么都不做。但是,就性能而言,这不是问题。是否使用传播为来自目标对象本身的每次调用启动新事务。如果像这样调用find(),则applicationContext.getBean(this.getClass()).find()spring将使用当前事务。您可以添加注释,要求在find()声明中添加新的内容,Spring将在每次调用时启动一个新事务。从同一个Bean调用内部的Bean是否安全。你能告诉我这是否会对我的系统造成间接影响吗。因为我从来没有做过这样的事情,而且这个项目非常关键,应该是一致的,所以我担心在bean中访问同一个bean,因为它本身工作得很好,谢谢你在这方面的帮助。接受这一点作为答案,让我知道在同一个bean中使用applicationContext使用bean的间接影响(如果有的话)。事实上,当你不得不做这种“把戏”时,它说明了你的体系结构中的一个问题。也许您的服务层应该被重新组织,或者您应该添加一个编排层,或者注意到一些无用的层除了调用另一个层之外什么都不做。然而,就性能而言,这不是一个问题。