这样是否阻碍了doSomething本地事务运行,我希望在doSomething执行结束后本地事务提交,并返回结果,当异步事务结束后,如果有异常本地已提交的事务也进行回滚
时间: 2024-03-15 14:47:15 浏览: 58
如果要确保doSomething本地事务提交并返回结果后再执行异步事务,可以将异步任务的执行放在CompletableFuture的thenRun方法中,这样可以确保doSomething执行完毕后再执行异步任务。同时,需要在异步任务完成时判断是否有异常,如果有异常则回滚本地事务。
修改后的代码如下:
```
import javax.transaction.Transactional;
import javax.transaction.Transactional.TxType;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Service
public class MyService {
private ExecutorService executorService = Executors.newFixedThreadPool(10);
@Transactional(propagation = Propagation.REQUIRED)
public void doTransaction() {
// 本地事务1
doSomething();
// 执行异步任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 异步任务中执行事务操作
doTransactionInAsync();
}, executorService);
// 异步任务完成时,确保事务已经提交或回滚
future.thenRun(() -> {
if (future.isCompletedExceptionally()) {
// 异步任务执行异常,回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return;
}
// 异步任务执行成功,提交事务
TransactionAspectSupport.currentTransactionStatus().flush();
});
}
@Transactional(value = TxType.REQUIRES_NEW)
public void doTransactionInAsync() {
// 异步任务中执行的事务操作
// 这里需要确保所有涉及到事务的操作都在同一个事务中
// 在异步任务完成之前提交事务
}
}
```
阅读全文