精华内容
下载资源
问答
  • 方式一: 使用Callable, 利用Callable的返回值判断是否需要进行事务回滚 ExecutorService service = Executors.newCachedThreadPool(); Future<Integer> submit = service.submit(new Callable() { @Override

    方式一: 使用Callable, 利用Callable的返回值判断是否需要进行事务回滚

        ExecutorService service = Executors.newCachedThreadPool();
        Future<Integer> submit = service.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("bla bla ...");
                return 5 * 3;
            }
        });
        try {
            if (submit.get() == 15) {
                throw new RunTimeException("操作失败!");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    

    方式二: 使用FutureTask

     Callable<Integer> integerCallable = new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    return 10;
                }
            };
            ExecutorService executor = Executors.newCachedThreadPool();
    
            FutureTask<Integer> futureTask = new FutureTask<>(integerCallable);
            try {
                Object o = executor.submit(futureTask).get();
                    throw new RuntimeException();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            executor.shutdown();
    展开全文
  • 线程事务回滚

    万次阅读 2016-05-10 14:43:08
    使用Callable接口获取并发任务结果,实现对线程异常的感知并重新出运行时异常实现事务回滚

    一、背景:

            使用javax.jms.MessageListener监听消息,监听到消息后使用线程执行器ThreadPoolExecutor进行业务处理,并配置了事务JmsTransactionManager,当业务处理出现异常时,进行回滚操作。

    二、问题:

           业务中可能出现的两类异常:

              1.业务处理出现checked exception必须在线程中捕获处理不允许抛出;

              2.如果线程抛出unchecked exception,则线程终结,主线程不受影响。

           基于以上对线程处理异常的认识,可以确定使用多线程处理业务中出现的异常在主线程中无法捕获,即无法实现回滚。

    三、解决办法:

          使用Callable接口(Executor Framework的优势之一:可以运行并发任务并返回结果)。

    线程执行器业务处理代码:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
    				KEEP_ALIVE_TIME, UNIT, new ArrayBlockingQueue<Runnable>(
    						queueSize));
    Future<String> future = executor.submit(new Callable<String>() {
    			public String call() {
         try {
           ……
          } catch (Exception e) {
         //捕捉到异常时进行异常处理并返回failed
        return  “failed”;
        }
        //业务处理正常则返回success
       String result = "failed";
       	try {
                   //通过回调获取线程执行是否出现异常
    			result = future.get();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        return result;
       }
    });
    监听器实现事务回滚代码:

    // 消息进行业务处理并返回处理结果,sucess(成功),failed(失败)
    String result = serviceConfiguration.getServerProcessThreadPool().process(message);
    // 获取到业务处理异常时即result为"failed",抛出运行时异常进行事务回滚
    if ("failed".equals(result)) {
    	throw new RuntimeException();
    }

     
    
     
    
     
    

    展开全文
  • 但是我们有的时候需要事务回滚并不一定是代码发生了异常,而是我们对业务逻辑的判断需要回滚事务,这时候,我们需要手动抛出运行时异常,例如: /** * before */ if (null == obj) { // 手动抛异常 throw new ...

    我们通常在项目中都是使用全局事务配置,这样我们就不必在每个业务类的方法上加 @Transactional 注解,只要代码抛出异常,就会自动回滚事务

    但是我们有的时候需要事务回滚并不一定是代码发生了异常,而是我们对业务逻辑的判断需要回滚事务,这时候,我们需要手动抛出运行时异常,例如:

    /**
     * before
     */
    if (null == obj) {
        // 手动抛异常
        throw new RuntimeException("对象为空,不能继续进行");
    }
    /**
     * after
     */
    

    当我们判断 obj 对象为空时,我们不能继续进行下面的业务逻辑了,而在这之前,我们已经对数据库做了操作,这时候,我们就需要手动抛出 RuntimeException(运行时异常),还可以自定义异常提示信息

    注意:必须是 RuntimeException 或继承了 RuntimeException 的异常类才能回滚事务

    我们在控制层(controller 层)对该异常进行捕获,并能拿到自定义异常信息,例如:

    try {
        return userInfoService.saveUserInfo(userInfo);
    } catch (RuntimeException e) {
        e.printStackTrace();
        // 统一结果返回类,包含:code,msg,data
        return R.error(e.getMessage());
    }
    

    我们使用 try catch 对该方法进行捕获,当发生异常时,便能回滚事务,并且返回自定义异常信息了,非常好用

    如您在阅读中发现不足,欢迎留言!!!

    展开全文
  • 问题 一般情况下 try{}catch{}的使用回使得@...可使用如下方式 实现事务回滚 @Transactional(rollbackFor = Throwable.class) @Override public DocIstBO savePOIDoc(SaveDocDTO saveDocDTO) { try...

    问题  一般情况下 try{}catch{}的使用回使得@Transactional注解失效

    可使用如下方式 实现事务回滚

    @Transactional(rollbackFor = Throwable.class)
        @Override
        public DocIstBO savePOIDoc(SaveDocDTO saveDocDTO) {
            
           try{
    }catch{
        //第一钟方法  手动回滚
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        //第二种方法 直接抛出异常 当前线程停止运行 事务回滚
         throw CommonException.exception("io error 模板文件不存在");
    
    }
    
    }

    @Transactional注解的全部属性详解

    属性类型描述
    valueString可选的限定描述符,指定使用的事务管理器
    propagationenum: Propagation可选的事务传播行为设置
    isolation enum: Isolation可选的事务隔离级别设置
    readOnly    boolean    读写或只读事务,默认读写
    timeout    int (in seconds granularity) 事务超时时间设置
    rollbackFor    Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
    rollbackForClassName    类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
    noRollbackFor    Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
    noRollbackForClassName    类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

     

    展开全文
  • spring异常抛出触发事务回滚策略 Spring、EJB的声明式事务默认情况下都是在出unchecked exception后才会触发事务的回滚测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以...
  • 线程事务回滚 说明:主要就是使用ThreadPoolExecutor的submit方法,因为submit方法的参数可以传callable(execute方法传runnable没有返回值),callable可以有返回值,通过future.get()方法获得子线程的返回值,...
  • 这里写目录标题背景介绍...2.在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程
  • http://blog.csdn.net/mynameismt/article/details/51363120多线程事务回滚业务模型期望的结果是这样的,检测子线程异常情况,如果发生异常,主线程回滚,否则提交大家都知道runnable有以下特点: 1.业务处理...
  • PS:测试已通过,部分数据操作,全部数据回滚,检查数据库无数据插入。 测试代码 @SpringBootTest @RunWith(SpringRunner.class) public class PlantTest { @Autowired private PlantService plantService; @...
  • 事务回滚

    千次阅读 2012-05-25 16:12:27
    框架里面用了Spring的AOP处理事务,事务针对Biz级别来做,而异常统一都用自定义的RuntimeException。...改为向外RuntimeException后,事务回滚了。 Google之,发现原因如下: Spring的AOP事务管理默认是针对unchec
  • Spring @Transactional 事务回滚

    千次阅读 2017-10-24 16:12:56
    Author 陈秀红 Date 2017/9/30 Spring @Transactional 事务回滚 Spring Transactional 事务回滚一问题描述 二JAVA异常 异常简介 异常架构 1Error与Exception ...1如果没有捕获异常事务会回滚 2如果捕获了异常事
  • spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。 1:首先说明一下异常是什么,有什么区分,以及常见的异常? Java里面异常分为两大类:checkedexception(检查...
  • 事务遇到异常回滚机制

    千次阅读 2018-05-29 13:32:37
    checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 ...
  • 关于事务回滚

    2019-06-25 16:06:39
    //Propagation.REQUIRED : 有事务就使用当前的事务,没有事务就创建一个事务 ...//rollbackFor = Exception.class :事务回滚异常类型 @Transactional(propagation = Propagation.REQUIRED,isolation = I...
  • 问题:初学者在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常.经过查看和总结,其中有错误的,请留言,会尽快改正. 一、特性 先了解一下...
  • Struts2与Hibernate整合,有时会使用OpenSessionInView模式控制会话及事务,那么这时Filter的设计通常如下...事务回滚; } 看似很合理,但是catch里面的语句块无法到达,即使过程中出现异常,也无法到达,原因就是事务
  • spring事务回滚处理+多线程异步处理

    千次阅读 2015-10-17 13:40:00
    检查:确认有抛异常,确认扫描包的位置正确,确认没有重复扫描对应包。 通常只会在service层处理事务回滚操作.   一、注解方式配置spring事务处理 XML配置: spring.xml:   id="txManager" class...
  • Springboot添加事务回滚

    千次阅读 2021-01-13 11:36:52
    Springboot添加事务回滚 在java开发中经常会遇到这种类似这种情况,批量插入数据的时候,有一条除了问题导致程序终止但是之前的都已经插入。对于已经出了问题的程序。之前插入的数据难保其正确性,所以当出了问题...
  • throw new RuntimeException("xxx"); //事务回滚 throw new Exception("xxx"); //事务没有回滚
  • Spring事务回滚总结

    2019-10-24 09:30:35
    事务的管理方式有两种,第一种是编程式事务管理,需要将数据库的自动提交等取消,并且需要自己编写事务代码,第二种则是声明式事务管理模式,spring利用spring AOP特性编写了注解即题目中所提到的方式来管理事务,...
  • 项目环境:sprinigboot 项目任务:每天定时更新170条数据,某条数据更新出错时需要记录下来并回滚当条记录所关联的表数据。...但是在测试的时候直接使用A方法能够实现异常事务回滚,使用B方法则不能...
  • 一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚。这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着《XX公司关于三十岁...
  • https://blog.csdn.net/zzhongcy/article/details/102893309
  • Spring声明式事务 回滚

    2021-01-22 15:05:45
    如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常...
  • spring事务回滚相关

    2018-11-29 14:12:35
    事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退...这是个很常见的小坑,异常并没有被 “捕获” 到,导致事务并没有回滚。我们在业务层代码中,也许已...
  • Spring事务源码解析之事务回滚

    千次阅读 2018-01-14 17:53:12
    阅读须知文章中使用//单行注释做代码的简单注释,而/**/多行注释的代码会做深入分析,为了避免篇幅过长,删掉...正文承接上文,Spring事务会根据目标业务方法的执行结果做提交或回滚操作,我们先看一下回滚操作: Tra
  • 自己之前是按照视频整合ssm框架,老师在配置好事务之后,并未进行测试,自己也是出于好奇就进行事务回滚测试,自己插入两条记录到数据库,第一条是正确信息,然后第二条是错误的,但是发现当报出异常后数据库信息未...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,570
精华内容 7,828
关键字:

线程抛异常事务回滚