spring synchronized Transactional 无效解决办法

来源:互联网 发布:通州淘宝城 编辑:程序博客网 时间:2024/05/17 06:48

上周遇到一个问题,就是  synchronized  加  Transactional  导致事物失效的问题,在网上搜了一堆,都是说什么在外层套一个没有事物的方法,在加synchronized ,亲测无效,并且即使没有并发问题,单个操作的时候,你就会发现即使代码报错,事物是 不会回滚的! 下面写出我的解决办法。



原有的代码不要动,该有事物就有事物,然后在 主要是在 Controller 层,添加线程池控制。

这里我就不写公司的源码了,直接把精简的东西拿出来。

@Controller

public class TestController{


private  ExecutorService exec = null;

@RequestMapping("abc")

public String abc(){


 if(exec ==null){

          //如果线程池为空或者该线程池被关闭了,就新建一个单例的线程池

            exec = Executors.newSingleThreadExecutor();
            }else if(exec.isShutdown() ){
                exec = Executors.newSingleThreadExecutor();
            }

          //由于我们需要捕获线程抛出的异常,或者说是service层抛出的异常,我们用线程池的submit方法来执行我们的业务,submit是可以有返回值的

         //为啥要用future,因为如果要捕获异常,就要保障线程的同步的,所以要用str.get(),如不这样写,你是无法捕获这个线程的异常的,他已变成异步线程了。

             Future<String> str = exec.submit(new Callable<String>() {
                 @Override
                 public String call() throws CoreException {
                   //TODO 你的业务方法  (service.save())
                    return "1";    
                 }
            });
            try {
                str.get();
             } catch (Exception e1) {
                    log.info(e1);
                     throw new Exception("系统异常");
                }
             }
            exec.shutdown();

}

}

转载请注明出处!!!

原创粉丝点击