Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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_Jdbc - Fatal编程技术网

Java Spring事务注释-获取活动事务

Java Spring事务注释-获取活动事务,java,spring,jdbc,Java,Spring,Jdbc,在我的Spring应用程序中,我将服务层方法标记为@Transactional(propagation=propagation.REQUIRED),并使用。通常,当方法完成时自动提交事务的默认行为就像一个符咒。但在特定情况下,我需要在方法结束前不久提交-是的,即使在该点之后的部分抛出异常 在这样一个方法中是否有一种方法可以访问当前事务?我试过这个: TransactionDefinition td = new DefaultTransactionDefinition(TransactionDef

在我的Spring应用程序中,我将服务层方法标记为
@Transactional(propagation=propagation.REQUIRED)
,并使用
。通常,当方法完成时自动提交事务的默认行为就像一个符咒。但在特定情况下,我需要在方法结束前不久提交-是的,即使在该点之后的部分抛出异常

在这样一个方法中是否有一种方法可以访问当前事务?我试过这个:

TransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_MANDATORY); // make sure we're talking about the same transaction already provided by the annotation
TransactionStatus status = transactionManager.getTransaction(td);

// perform various JDBC operations

transactionManager.commit(status);
methodThatNeedsToBeCalledAfterCommit();
但是通过查看我的日志,我只看到“AbstractPlatformTransactionManager.processCommit(752)| Initiating transaction commit”发生过一次,从时间戳来看,这似乎是在
方法之后,需要调用tercommit()
,这将是
@Transactional
方法的正常行为


有没有办法在这种方法中强制提交?

我不这么认为。此外,Spring将在方法结束时尝试重新提交。 因此,第二个问题是:糟糕

你应该重新考虑你的方法的组织。
可能将现有的一种方法分为两种:一种方法使用@trnaActional,另一种方法使用剩余的行。

这可能是因为默认事务传播是必需的,因此只有在整个事务完成时才会提交,这是您的外部方法。您可以尝试使用传播\u REQUIRES\u NEW:

td.setPropagationBehavior(需要TransactionDefinition.PROPAGATION)


另一种选择是使用

尝试从要应用事务的程序调用此方法

     DefaultTransactionDefinition transdefinition = new DefaultTransactionDefinition();
         PlatformTransactionManager manager =new  PlatformTransactionManager(); 
         TransactionStatus status=null;




public void beginTransaction()
    {

        transdefinition.setPropagationBehavior(0); 


         status = manager.getTransaction(transdefinition);
    }

public void commitTransaction()
    {
if(status.isCompleted()){
manager.commit(status);
    }
}

 public void rollbackTransaction()
    {
if(!status.isCompleted()){
       manager.rollback(status);  
    }
}

嗯,我不一定介意最后的重新承诺。但是从设计的角度来看,这确实属于一个方法,所以不要使用这个方法的注释,而是使用手动方式使用事务处理。您将完全控制您的事务。好吧,我上面的代码基本上是在做手动操作,对吗?所以我同意。但我希望能够使用我已经在使用的相同事务。特别是,这是因为此方法也是从设置了
@Rollback
的JUnit测试调用的。但是,如果在代码中手动提交,单元测试中的@Rollback将不会产生任何效果。