我应该在何时何地调用TransactionSynchronizationManager.registerSynchronization()?

时间:2016-06-03 10:57:36

标签: java spring transactions spring-transactions

出于不同的原因,我们已经实现了自己的PlatformTransactionManager,它委托给“真正的”TransasctionManager。

这样做的一个目标是能够在事务成功完成时执行索引(使用Solr)。在事务内部,我们构建了一组需要编制索引的实体。如果事务提交,则刷新并处理该集合,如果它是回滚,则该集合将被丢弃。

我最近遇到过PlatformTransactionManager,它似乎很适合处理这个问题。 (fwiw:这个项目使用Spring的TransactionTemplate而不是@Transactional)。以下是它目前的处理方式:

@Override
public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
    TransactionStatus transactionStatus = delegate.getTransaction(definition);
    if (!TransactionSynchronizationManager.getSynchronizations().contains(this)) {
        TransactionSynchronizationManager.registerSynchronization(this);
    }
    return transactionStatus;
}

@Override
public void afterCompletion(int status) {
    switch (status) {
    case STATUS_COMMITTED:
        notifyCommit();
        break;
    case STATUS_ROLLED_BACK:
        notifyRollback();
        break;
    }
}

我找不到有关如何进行此类同步的任何好文档。

  • 有没有更好的方法来检查我是否已添加同步?
  • 在事务管理器的getTransaction方法中执行此操作是否可以?
  • 我应该进行任何手动清理吗?

0 个答案:

没有答案