@Transactional
注解用于开启事务,当在高并发情况下我们可能为了保证数据的安全使用悲观锁,可以在方法上使用synchronized
使用悲观锁。但可能存在一些问题。
@Transactional
@Service
public class OrderService {
@Autowired
private OrderDao orderDao;
public sychronized Order getOrder(int id) {
return orderDao.getOrder(id);
}
}
因为@Transactional
控制事务的范围比sychronized
大,所以可能导致当一个线程执行完方法并释放锁后,事务并未提交,第二个线程又获得了该锁,导致数据出问题。
解决方案:缩小@Transactional
控制事务的范围小于sychronized
@Service
public class OrderService {
@Autowired
private OrderDao orderDao;
public sychronized Order updateOrder(int id) {
return updateOrderSafely(id);
}
@Transactional
public Order updateOrderSafely(int id) {
return orderDao.updateOrder(id);
}
}
这样就能保证先提交事务,再释放锁。