美文网首页
由bug所得

由bug所得

作者: dotff | 来源:发表于2019-02-20 11:53 被阅读0次
    一. service方法加synchronized但还是并发下错误的问题[20190220]
    • 问题描述
      业务层方法上加了synchronized但还是线程不安全,代码如下
        @Transactional
        public synchronized void addEmployee() {
            Employee employee = employeeRepository.getOne();
            employee.setAge(employee.getAge(); + 1);
            employeeRepository.save(employee);
        }
    
    • 错误原因
      Spring事务的底层是Spring AOP,动态代理在调用方法完成后执行事务提交,并发情况下会导致方法执行完了但事务还没提交,别的线程有进入此方法(synchronized块内的方法已经执行完毕了),此时读到的是事务提交之前的旧数据
    • 解决方法
      @Transcational 不和 synchronized一起用,即新建一个synchronized方法在这里调用去掉锁的addEmployee方法(这样就会使加锁的范围包括到整个事务)。或者方法内手动提交事务

    相关文章

      网友评论

          本文标题:由bug所得

          本文链接:https://www.haomeiwen.com/subject/gfgcyqtx.html