【问题标题】:Spring attach data to the current transactionSpring将数据附加到当前事务
【发布时间】:2014-04-09 21:46:07
【问题描述】:

有没有办法在 Spring 中访问当前事务?我的目标是在事务启动时向事务添加一些信息,并在同一事务中的所有方法调用中使用该信息。

这是 EJB 的解决方案:How can i attach data to a JTA transaction? (or uniquely identify it) 我正在寻找与 spring 相同的解决方案。

【问题讨论】:

标签: java spring transactions


【解决方案1】:

您可以使用ThreadLocal 将数据附加到线程,然后使用TransactionSynchronizationManager 清除ThreadLocal,从而有效地创建事务范围变量:

TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronizationAdapter() {
        @Override
        public void afterCompletion() {
            ... clear the ThreadLocal ...
        }
    }
);

【讨论】:

  • 我不想将数据附加到所有线程,而只想附加到事务。在我提到的链接中的 EJB 中,我们可以使用 SessionSynchronization 将对象附加到当前事务,TransactionSynchronizationManager 是否扮演相同的角色以及如何?
  • 它扮演同样的角色,对registerSynchronization 的调用将TransactionSynchronizationAdapter 添加到在事务生命周期的不同点执行的回调列表中,在这种情况下是在提交或回滚之后。通过将变量存储在线程上并在下一次提交时清除线程变量,这使得变量有效地事务范围
  • 所以你说在一个线程中一次只有一个事务?而且一个事务不能共享给另一个线程?
  • 这是正确的,除非您没有使用最常见的事务管理器,例如 JpaTransactionManager 或 HibernateTransactionManager。也可能存在嵌套事务,但这也是一种不寻常的情况。目前在绝大多数 Spring 应用程序中,这两条语句都是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多