如何使用@Async 和@Transactional 在多线程中回滚?

Posted

技术标签:

【中文标题】如何使用@Async 和@Transactional 在多线程中回滚?【英文标题】:How to use @Async and @Transactional for rolling back in multi threading? 【发布时间】:2022-01-07 03:16:04 【问题描述】:

我的要求是回滚多线程系统中的所有事务 如果其中一个线程遇到异常。

package com.demo.multithread; 

@Repository
@Configuration
public class DemoService 

    @Autowired
    private EntityManager entityManager;
    
    @Bean
    @Transactional(rollbackFor = Exception.class,Error.class)
    public void callProcedure()
    
        StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("MyProcedure");
        query.execute();
    

下面是我如何使用 Async。

package com.demo.multithread; 

@Repository
@Configuration
@EnableAsync
public class DemoDAO 

@Autowired
public DemoService demoService;

@Bean(name = "threadPoolTaskExecutor")
    public ExecutorService executorService() 
    
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(10);
        executor.setThreadNamePrefix("myThread-");
        executor.initialize();
        System.out.println("Returning from executor service");
        return executor.getThreadPoolExecutor();
    

@Async(value ="threadPoolTaskExecutor")
     public void asyncMethodWithConfiguredExecutor() throws InterruptedException 
     
        System.out.println("Thread ID~" + Thread.currentThread().getId()+ " is running and thread name is ~"+Thread.currentThread().getName());
        demoService.callProcedure();
     

问题是:

    没有发生多线程。 在启动时只创建了 1 个线程。 如果我同时使用@Async 和@Transactional(我不应该这样做),那么 多线程发生。但回滚不起作用。

【问题讨论】:

【参考方案1】:

当@Async 方法启动时,它会在一个新线程上运行,这就是@Transaction 不起作用的原因。 @Async 方法调用不能回滚,但是没有异步调用,你可以进行回滚。

【讨论】:

以上是关于如何使用@Async 和@Transactional 在多线程中回滚?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring 和 Hibernate 中使用两个数据库/数据源

如何使用 async 和 await 使方法异步?

如何使用 Async / Await 和 React 钩子?

如何知道它正在使用 async 和 ngFor 加载

如何使用@Async 和@Transactional 在多线程中回滚?

Angular 8 - 如何使用 Promises 和 Async/Await [重复]