由bug所得

一. 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所得)