美文网首页
由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