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



在我的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次提交:糟糕。

你应该重新思考你的方法的组织。也许可以将现有的方法分为两种:一种使用@Trnasectional,另一种使用剩余的行。

这可能是因为默认的事务传播是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);  
    }
}

最新更新