Java Spring@Transactional多线程

Java Spring@Transactional多线程,java,spring,transactions,Java,Spring,Transactions,我在事务作用域中运行了一个方法a,该方法: 修改实体A以从状态A切换到状态B 将任务传递给执行者服务,该服务期望实体在执行时处于状态B 问题是,当这个任务在方法A提交之前运行(我无法控制)时,它看不到所需状态的更改,因为它在方法A级别事务结束之前不会阻塞 任务使用Springbean和@Transactional注释方法运行,如下所示: @Service public class TransactionalProcessingAdapter implements ProcessingAdapte

我在事务作用域中运行了一个方法a,该方法:

  • 修改实体A以从状态A切换到状态B
  • 将任务传递给执行者服务,该服务期望实体在执行时处于状态B
  • 问题是,当这个任务在方法A提交之前运行(我无法控制)时,它看不到所需状态的更改,因为它在方法A级别事务结束之前不会阻塞

    任务使用Springbean和@Transactional注释方法运行,如下所示:

    @Service
    public class TransactionalProcessingAdapter implements ProcessingAdapter {
    
        @Override
        @Transactional
        public void execute(ProcessingAdaptedMethod processingAdapter) {
            processingAdapter.execute();
        }
    
    }
    

    我做错了什么?谢谢

    问题在于Spring事务是线程绑定的-例如,事务仅在其初始线程内可见。ThreadLocal用于实现该属性


    您可能希望在Spring中实现自己的TransactionSynchronizationManager并注入它。使用类似于InheritableThreadLocal的内容,而不是ThreadLocal。

    可能重复的“我有点困惑”。在一个方法中启动一个事务,然后在该方法的主体中,在另一个线程中执行一个任务,并期望它看到您所做的更改。您不能真正做到这一点,您应该更改事务边界,或者退回到事务的编程使用上(使用
    TransactionTemplate
    ),长话短说,使用注释无法做到这一点?使用JTA/XA怎么样?问题是这只是问题的一部分——另一部分是我也使用JMS,但只有一个数据库。在某些情况下,如果JMS调用的方法失败,我希望回退。问题是,我希望第二个线程等待第一个线程中的事务完成……我的观点是,您无法看到您在另一个线程中做了什么。这与Spring或您使用的事务管理器无关。即使在某些边缘情况下,有办法使其工作,事务对其线程也是私有的。