由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
网友评论