Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 Spring未提交事务_Java_Spring_Spring Transactions - Fatal编程技术网

Java Spring未提交事务

Java Spring未提交事务,java,spring,spring-transactions,Java,Spring,Spring Transactions,我在我的项目中做过类似的事情。 我手动回滚事务,为此我插入了try-catch块并在catch块中手动回滚事务。 现在我从method1调用method2,并将对象保存到method2中的数据库中,但它不会将对象保存到数据库中 @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class) @Scheduled(cron = "0 5 16 * * ?") publ

我在我的项目中做过类似的事情。 我手动回滚事务,为此我插入了try-catch块并在catch块中手动回滚事务。 现在我从method1调用method2,并将对象保存到method2中的数据库中,但它不会将对象保存到数据库中

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
@Scheduled(cron = "0 5 16 * * ?")
public void method1() {

try{
---try block---
}
catch(Throwable t){
TransactionAspectSupport.currentTransactionStatus()
                .setRollbackOnly();
method2();
}
}

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void method2() {
---saving object to database----
someService.update(object);
}
我只是想知道,在method1的faliure上保存method2中的对象的可能解决方案是什么


Thanx提前。

我认为,一旦事务像调用method2之前那样回滚,事务就会像kaput一样完成,您不能继续使用它并期望提交。这需要是一项新的交易,例如,在程序上:

// transactionManager is your platorm transaction manager usually injected
TransactionTemplate transactionTempate = new TransactionTemplate(transactionManager);

transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                method2();
            }
        });

您正在一个必需的事务中运行方法2,它必须是一个必需的新事务。在需要的情况下,如果还没有事务,EJB将创建一个事务,如果有事务,EJB将使用当前事务。method2使用method1中的事务,因此两个方法都在同一事务中。当method1回滚事务时,它回滚在中执行的更新method2@forgivenson-如何更新method2中的对象?@user3404577这些方法在不同的类中吗?如果是这样的话,按照肯尼斯的建议去做就行了。如果它们在同一个类中,并且您使用的是默认的Spring代理事务处理,而不是aspectj,那么它将不起作用,因为事务性注释仅在从另一个类调用方法时才被处理,并且可以通过代理重新路由。@KennethClark-我尝试了需要\u new,但这也没有效果。@dmansifield-我应该在TransactionSpectSupport.currentTransactionStatus.setRollbackOnly之后写这个吗?因为method2没有被调用。我认为您可以将所有这些放在一个方法中,然后从异常处理程序调用它。除非我误解了什么,否则您试图修复的情况是,当从异常处理程序调用method2时,method2的更新没有提交。它仍然没有被调用。即使在method2被调用之后,它仍然不工作。您使用的是同一个EJB会话吗?在基于hibernate的代码中,我必须确保在新事务中从EntityManager工厂获得一个新会话/EntityManager。现有会话将绑定到旧事务。我不确定session在EJB中是否是正确的词,因为我们使用hibernate细节,但他们的entitymanager无论如何都会包装一个会话。