Spring将数据附加到当前事务

4
有没有一种方法可以在Spring中访问当前事务?我的目标是在事务开始时添加一些信息,并在同一事务中的所有方法调用中使用该信息。 这里有一个EJB的解决方案:如何将数据附加到JTA事务?(或唯一标识它) 我正在寻找相同的Spring解决方案。

在您的服务类中使用 @Inject 来注入事务。 - Braj
点击这里阅读 在Spring中访问当前事务 - Braj
阅读此部分理解Spring框架事务抽象 - Braj
@Braj 但这并不说明如何将对象添加到事务中。 - ilyes90
但它回答了你的第一个问题“有没有一种方法可以在Spring中访问当前事务?” - Braj
1个回答

1
你可以使用ThreadLocal将数据附加到线程上,然后使用TransactionSynchronizationManager清除ThreadLocal,从而有效地创建一个事务范围的变量:
TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronizationAdapter() {
        @Override
        public void afterCompletion() {
            ... clear the ThreadLocal ...
        }
    }
);

我不想将数据附加到所有线程,而只想将其附加到事务中。在我提到的链接中的 EJB 中,我们可以使用 SessionSynchronization 将对象附加到当前事务,TransactionSynchronizationManager 是否扮演了相同的角色,如何扮演? - ilyes90
它扮演着相同的角色,调用registerSynchronizationTransactionSynchronizationAdapter添加到回调列表中,在事务生命周期的不同点执行回调,本例中在提交或回滚后执行。通过在线程上存储变量并在下一次提交时清除线程变量,使变量有效地具有事务范围。 - Angular University
你的意思是说在一个线程中一次只能有一个事务?而且一个事务不能被分享到另一个线程? - ilyes90
1
除非您未使用最常见的事务管理器,如JpaTransactionManager或HibernateTransactionManager,否则才是正确的。此外,可能存在嵌套事务,但这也是不寻常的情况。目前,在绝大多数Spring应用程序中,这两个语句都是正确的。 - Angular University

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接