春季交易注释 - 获得活跃交易

春季交易注释 - 获得活跃交易

问题描述:

在我的Spring应用程序中,我有服务层方法,标记为@Transactional(propagation=Propagation.REQUIRED),并使用<tx:annotation-driven />。通常,方法完成时自动提交事务的默认行为就像魅力一样。但在特定情况下,我需要在方法结束之前立即提交 - 是的,即使在该点后面出现的部分引发异常。春季交易注释 - 获得活跃交易

有没有办法在这样的方法来访问当前事务?我尝试这样做:

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)|启动事务提交”发生一次,并从这个似乎是时间戳后methodThatNeedsToBeCalledAfterCommit(),这将是@Transactional方法的正常行为。

有没有一种方法可以在这种方法中实际强制进行提交?

我不这么认为。而且,Spring会在您的方法结束时尝试重新提交。 所以2提交:不好。

你应该重新考虑你的方法的组织。 也许用2种方法分割现有的一种:一种是@Trnasactional,另一种是剩下的线。

+0

那么,我不一定会介意最后的承诺。但从设计角度来看,这确实属于单一方法。 – Dan 2012-07-27 15:30:29

+0

因此,不要使用此方法的注释并使用手动方式来使用转换。您将完全控制您的交易。 – 2012-07-27 15:33:39

+0

那么,我上面的代码几乎是在做手动的东西呢?所以我很好。但我希望能够使用我已经使用的相同事务。特别是,这是因为此方法也是从具有'@ Rollback'集的JUnit测试中调用的。 – Dan 2012-07-27 15:59:03

这可能是因为默认事务传播是PROPAGATION_REQUIRED,所以只会在整个事务完成时才提交 - 这是您的外部方法。您可以尝试PROPAGATION_REQUIRES_NEW:

td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

另一种方法是使用TransactionTemplate

从那里你想申请交易程序试试这个调用此方法。

 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); 
    } 
}