如果在service层的方法上同时使用事务和锁无法保证同步
例如:
@Service
public class Demo{
@Transactional
public void synchronized update() {
............
}
}
上面这个例子是无法保证数据的一致性
synchronized执行是在事务之内,在代码块执行完时,事务还没有提交,其他线程进入synchronized后,读取的库存数据不是最新的
因此synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时释放掉synchronize的锁,事务还未提交,其他线程进入synchronized代码块后,读取的库存数据不是最新的。
所以要解决这个问题,有两个方案
方案一(@Transactional控制访问权一定要public,protect,private会事务失效)
@Override
public synchronized void update() {
update();
}
@Transactional
public void update() {
.......
}
方案二
@Service
public class Demo{
@Transactional
public void update() {
synchronized(this){
.........
}
............
}
}
保证synchronized的锁范围要比事务的锁要大
一键查询淘宝/拼多多内部优惠券,每日大额外卖红包,购物省钱的宝藏工具