CompletableFuture事务处理
事务处理 CompletableFuture
2023-06-13 09:15:46 时间
男人的盟誓是女人的陷阱——莎士比亚
使用CompletableFuture
进行异步任务编排时,可能会有事务的支持需求,我们这里可以使用之前我写的手动回滚、提交事务进行处理
代码案例如下,所用框架stream-query:
首先是不加事务的
package io.github.vampireachao.stream.plugin.mybatisplus;
import io.github.vampireachao.stream.plugin.mybatisplus.pojo.po.UserInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
/**
* AsyncTest
*
* @author VampireAchao
* @since 2022/12/6
*/
@SpringBootTest
class AsyncTest {
@Test
@Transactional
void test(@Autowired ThreadPoolTaskExecutor executor) {
UserInfo userInfo = new UserInfo();
userInfo.setName("ruben");
Database.save(userInfo);
CompletableFuture.runAsync(() -> {
Assertions.assertNotNull(userInfo.getId(), "id is null");
Assertions.assertNotNull(Database.getById(userInfo.getId(), userInfo.getClass()), "user is null");
}, executor).join();
}
}
此处会抛出assertNotNull
,提示user is null
因为外部事务未提交,但内部默认事务没有设置为读未提交
修改后事务支持的代码:
package io.github.vampireachao.stream.plugin.mybatisplus;
import io.github.vampireachao.stream.plugin.mybatisplus.pojo.po.UserInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
/**
* AsyncTest
*
* @author VampireAchao
* @since 2022/12/6
*/
@SpringBootTest
class AsyncTest {
@Test
@Transactional
void test(
@Autowired TransactionTemplate transactionTemplate,
@Autowired ThreadPoolTaskExecutor executor) {
UserInfo userInfo = new UserInfo();
userInfo.setName("ruben");
Database.save(userInfo);
CompletableFuture.runAsync(() -> {
PlatformTransactionManager transactionManager = Objects.requireNonNull(transactionTemplate.getTransactionManager());
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
try {
Assertions.assertNotNull(userInfo.getId(), "id is null");
Assertions.assertNotNull(Database.getById(userInfo.getId(), userInfo.getClass()), "user is null");
transactionManager.commit(transactionStatus);
} catch (Throwable e) {
transactionManager.rollback(transactionStatus);
throw e;
}
}, executor).join();
}
}
成功执行
相关文章
- 【Redis 系列】redis 学习六,redis 事务处理和监控事务
- MySQL分布式事务处理:可靠性与性能持平(mysql分布式事务处理)
- 事务Oracle XA事务: 实现跨数据库事务处理(oraclexa)
- MongoDB事务处理机制简介(mongodb事务)
- 从MySQL获取事务处理功能?(mysql有事务吗)
- Oracle事务处理简述,从基本概念到应用实践,一篇概览性的介绍。(oracle事务处理)
- 利用Node和MSSQL技术实现应用层事务处理(node mssql事务)
- Java与MySQL事务处理(mysql中java事物)
- MySQL三合一完美集成数据库事务处理和数据存储(mysql三合一)
- MySQL多表事务处理技巧与优化(mysql不同表的事物)
- Oracle事务处理如何保证数据完整性(oracle事物点)
- Oracle事务处理出现故障排查与解决方案(oracle事务产生问题)
- Oracle事务处理串行化路径(oracle事务串行)
- Redis集群模式下的事务处理策略(redis集群模式事务)