public class ThreadTransaction {
private final Logger LOG = LoggerFactory.getLogger(ThreadTransaction.class);
private PlatformTransactionManager platformTransactionManager;
private ThreadPoolExecutor threadPoolExecutor;
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
private List<Supplier> supplierList = new ArrayList<>();
private volatile CountDownLatch countDownLatch;
AtomicReference<Boolean> isError = new AtomicReference<>(false);
public ThreadTransaction(PlatformTransactionManager platformTransactionManager, ThreadPoolTaskExecutor threadPoolTaskExecutor) {
this.platformTransactionManager = platformTransactionManager;
this.threadPoolTaskExecutor = threadPoolTaskExecutor;
}
public ThreadTransaction(PlatformTransactionManager platformTransactionManager, ThreadPoolExecutor threadPoolExecutor) {
this.platformTransactionManager = platformTransactionManager;
this.threadPoolExecutor = threadPoolExecutor;
}
public ThreadTransaction(PlatformTransactionManager platformTransactionManager, ThreadPoolTaskExecutor threadPoolTaskExecutor, int size){
this.platformTransactionManager = platformTransactionManager;
this.threadPoolTaskExecutor = threadPoolTaskExecutor;
supplierList = new ArrayList<>(size);
}
public boolean addFunction(Supplier supplier){
return supplierList.add(supplier);
}
public void execute(){
LOG.info("多线程事务开始...");
countDownLatch = new CountDownLatch(supplierList.size());
for (Supplier supplier : supplierList) {
this.threadPoolTaskExecutor.submit(new TransactionRunnable(platformTransactionManager, supplier));
}
try {
if (isError.get()) {
LOG.error("多线程执行失败,事务已回滚!");
throw new RuntimeException("多线程执行失败!");
}
LOG.info("多线程执行成功,事务已提交!");
}catch (Exception e){
LOG.error("多线程执行失败:" + e.getMessage());
e.printStackTrace();
}
}
class TransactionRunnable implements Runnable{
private PlatformTransactionManager platformTransactionManager;
private Supplier supplier;
public TransactionRunnable(PlatformTransactionManager platformTransactionManager, Supplier supplier) {
this.platformTransactionManager = platformTransactionManager;
this.supplier = supplier;
}
@Override
public void run() {
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transaction = this.platformTransactionManager.getTransaction(defaultTransactionDefinition);
try {
this.supplier.get();
} catch (Exception e){
isError.set(true);
LOG.error("多线程事务执行失败{}", e.getMessage());
e.printStackTrace();
}
countDownLatch.countDown();
try {
if (isError.get()) {
LOG.info("多线程事务(子线程)回滚");
platformTransactionManager.rollback(transaction);
} else {
LOG.info("多线程事务(子线程)提交");
platformTransactionManager.commit(transaction);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2020-12-27 JAVA setObject使用