java 多线程回滚,多线程事务回滚
周五在java群里看到了一个有意思的问题,周末就顺便实现了一下,需求如下:
考察一个多线程的场景,一个Http?Request的controller有10个线程同时并行处理,要求:
1)?主线程必须等待10个线程全部执行成功后主线程返回“Success”
2)?只要其中任意一个线程出错,不仅当前出错的线程要回滚,其他所有线程不管成功失败也要回滚,主线程等待所有线程回滚完毕后输出相应的错误字符“Fail”。?
代码如下:
package com.mfunny.queue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
/**
*
*
*
*
*
*
* 修改历史: <br>
* 修改日期 修改人员 版本 修改内容
* --------------------------------------------------------------------
* 2016年03月26日 上午9:31 1.0 初始化创建
*
*
* @author
* @version 1.0
* @since JDK1.7
*/
public class Test {
private static class Rollback {
public Rollback(Boolean needRoolBack) {
this.needRoolBack = needRoolBack;
}
private Boolean needRoolBack = false;
public Boolean getNeedRoolBack() {
return needRoolBack;
}
public void setNeedRoolBack(Boolean needRoolBack) {
this.needRoolBack = needRoolBack;
}
}
private static class Task implements Runnable {
/**
* 监控10个子任务的执行
*/
private CountDownLatch childMonitor;
/**
* 监控主线程
*/
private CountDownLatch mainMonitor;
/**
* 存储线程的返回结果
*/
private BlockingDeque resultList;
/**
* 回滚类
*/
private Rollback rollback;
public Task(CountDownLatch childCountDown, CountDownLatch mainCountDown, BlockingDeque result, Rollback rollback) {
this.childMonitor = childCountDown;
this.mainMonitor = mainCountDown;
this.resultList = result;
this.rollback = rollback;
}
private void shouldRollBack() {
System.out.println(Thread.currentThread().getName()+"开始回滚");
}
/**
* 事务提交
*/
private void submit() {
}
/**
* 执行任务,返回false表示任务执行错误,需要回滚
* 本案例中根据线程名字包含Thread-8判断是否回滚
* @return
*/
private Boolean processTask() {
if(Thread.currentThread().getName().contains("Thread-8"))
return false;
return true;
}
@Override public void run() {
System.out.println(Thread.currentThread().getName()+"子线程开始执行任务");
Boolean result = processTask();
//向队列中添加处理结果
resultList.add(result);
//等待其他的子线程执行完成,一起执行主线程的判断逻辑
childMonitor.countDown();
try {
//等待主线程的判断逻辑执行完,执行下面的是否回滚逻辑
mainMonitor.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"子线程执行剩下的任务");
//需要回滚
if (rollback.getNeedRoolBack())
shouldRollBack();
else
//不需要回滚->事务提交
submit();
}
}
public static void main(String[] args) {
//监控10个子线程的任务执行
CountDownLatch childMonitor = new CountDownLatch(10);
//监控主线程,是否需要回滚
CountDownLatch mainMonitor = new CountDownLatch(1);
//存储任务的返回结果,返回true表示不需要回滚,反之,则回滚
BlockingDeque results = new LinkedBlockingDeque(10);
Rollback rollback = new Rollback(false);
for (int i = 0; i < 10; i++) {
//10个任务启动
Thread thread = new Thread(new Task(childMonitor, mainMonitor, results, rollback));
thread.start();
}
try {
//监测10个子线程的执行
childMonitor.await();
System.out.println("主线程开始执行任务");
//根据返回结果来确定是否回滚
for (int i = 0; i < 10; i++) {
Boolean result = results.take();
if (!result) {
rollback.setNeedRoolBack(true);
}
}
//10个子线程开始执行
mainMonitor.countDown();
if(rollback.getNeedRoolBack())
System.out.println("Fail");
else System.out.println("Success");
} catch (Exception e) {
}
}
}
?思想就是使用两个CountDownWatch实现子线程的二段提交
?
顺便给群打一下广告:
java高级群(329019348)
java水群(51317874)
原文:http://lsk569937453.iteye.com/blog/2286415
java 多线程回滚,多线程事务回滚相关推荐
- oracle计算回滚时间,事务回滚时间估算
事务回滚时间估算 1. 当Oracle处于open 状态,当Oracle回滚事务的时候,可以从used_urec,used_ublk数值可以初步估计Oracle回滚事务 的速度. SQL> se ...
- Java后端之数据库操作事务回滚
什么是事物 事物是应用程序中一系列操作,事物完成是指所有的操作都完成,事物不完成是指一个操作也不能完成,事物结束有两种情况,当事务中的所有步骤全部完成时,事务提交,如果一个步骤失败,则发生回滚操作,撤 ...
- 什么是事务和事务回滚?
数据库理解事务: 为什么要有事务? 事务应用于各种场景,订单系统.银行系统 例如: 小明去某银行取钱,首先有以下几个步骤: 银行卡放入ATM机.,输入密码 连接数据库,验证账户密码 验证成功,获得用户 ...
- 数据库事务与事务回滚
目录 1.什么是事务? 2.事务的特性(ACID) 3.并发事务带来的问题 4.事务隔离级别 5.什么是回滚? 6.什么是事务回滚? 7.如何进行事务回滚 1.什么是事务? 事务是逻辑上的一组操作,要 ...
- 一套超好用的“Excel导入导出+多线程处理导入数据+多线程事务回滚”的模板方法
一.模板流程: 二.功能演示: 1.Excel数据: 数据说明:第一条数据完整,可以成功导入:第二条数据无姓名,业务逻辑姓名不允许为空,会导出到错误Excel中:第三条数据无姓名无类型,业务逻辑姓名类 ...
- java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题
往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...
- java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...
详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...
- java的oracle事务回滚_Oracle事务处理
二.事务和锁 当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表的结构.这里对我们的用户来讲是非常重要的. 三.提交事务 当用commit语句执行时可以提交事务.当执 ...
- java 事务 回滚
给java后台方法添加事务回滚注解,在方法进行多表的增删改查的时候,如果失败可以对此方法前面的一些更新数据库表的语句进行撤销(回滚) 注解:@Transactional(rollbackFor = E ...
- java事务什么时候回滚_spring事务什么时候会自动回滚
在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...
最新文章
- OSChina 周二乱弹 ——在影楼工作的妹子,可追不?
- android 注册、登录实现程序
- 设计模式学习笔记二:简单工厂模式
- python3.5安装scrapy_win10下基于python3.5安装scrapy教程
- Jm86中的encode_one_macroblock注释
- 过磅系统_简讯:崇义商砼公司开展无人值守过磅系统业务培训等二则
- 干货| 掌握这种逻辑思维,大厂面试成功率可提升90%
- oracle认证视频教程,Oracle认证专家视频教程-OCP全套教程之学习笔记-RMAN-CATALOG
- JSP中常用的字体类型
- odb对象关系映射系统
- A/B Test(AB测试) 流程、常见面试问题及解答
- html css blockquote,css之blockquote美化
- 焦作大学计算机专业分数线,焦作大学历年分数线 2021焦作大学录取分数线
- 截图工具当前未在计算机上运行 请重启_一个顶十个的工具箱软件,这才是真正的装机必备。...
- Formality使用总结1
- 程序员进阶攻略-笔记-041~050
- 手淘Android容器架构——Atlas的前世今生
- WebStorm快捷键(附官方pdf)
- Java 并发专题 CyclicBarrier 打造一个安全的门禁系统
- Wonderware-InTouch脚本程序、字符串拆分