概述
/**
* Spring 事务管理器
*/
@Autowired
private DataSourceTransactionManager transactionManager;
/**
* transaction 多线程事务 用例。
*因为Spring 用ThreadLocal进行了线程事务隔离 所以只能每个线程提交各自的事务
*等待业务逻辑处理完成再同时提交或回滚事务 达到多线程事务
* @throws Exception
*/
@GetMapping(value = "transaction")
public void transaction() throws Exception{
//线程计数器
CountDownLatch countDownLatch = new CountDownLatch(2);
//用于存储错误信息
List<String> ststus = new Vector<>();
//开启线程执行业务逻辑代码
new Thread(() ->{
//开启事务
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
//执行具体业务逻辑
userService.insertUser();
/**
* add 则表示业务逻辑处理时错误
*/
//ststus.add("error");
//无论成功或失败 计数器减1 表示线程业务逻辑处理完成
countDownLatch.countDown();
/**
* 等待计数器为0 所有线程皆处理完
*/
try {
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}
/**
* 如果 所有业务全部处理完成
* ststus:为空 没有错误 提交事务 / 不为空 有错误 回滚事务
*/
if(CollectionUtils.isEmpty(ststus)){
transactionManager.commit(status);
} else {
transactionManager.rollback(status);
}
}).start();
//开启线程执行业务逻辑代码
new Thread(() ->{
//开启事务
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
//执行具体业务逻辑
userService.insertUser();
//无论成功或失败 计数器减1 表示线程业务逻辑处理完成
countDownLatch.countDown();
/**
* 等待计数器为0 所有线程皆处理完
*/
try {
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}
/**
* 如果 所有业务全部处理完成
* ststus:为空 没有错误 提交事务 / 不为空 有错误 回滚事务
*/
if(CollectionUtils.isEmpty(ststus)){
transactionManager.commit(status);
} else {
transactionManager.rollback(status);
}
}).start();
}
最后
以上就是孝顺墨镜为你收集整理的java mybatis plus 多线程 事务 不懂的可以留言哦的全部内容,希望文章能够帮你解决java mybatis plus 多线程 事务 不懂的可以留言哦所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复