Spring Transaction Annotations - 获取活动事务

时间:2012-07-27 15:21:12

标签: java spring jdbc

在我的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)|启动事务提交”发生一次,从时间戳开始,这似乎是 {/ 1>}之后的将是methodThatNeedsToBeCalledAfterCommit()方法的正常行为。

有没有办法在这样的方法中实际强制提交?

3 个答案:

答案 0 :(得分:1)

我不这么认为。此外,Spring将尝试在您的方法结束时重新发送。 所以2提交:糟糕。

您应该重新考虑您的方法的组织。 也许用两种方法划分现有的一种:一种是@Trnasactional,另一种是剩余的线。

答案 1 :(得分:0)

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

td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

另一种选择是使用TransactionTemplate

答案 2 :(得分:0)

尝试从您要应用交易的程序中调用此方法。

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