并发系统中正确使用hibernate的evict和clear
前段时间在系统中发现一个问题,几经周折,终于找到问题的原因。
?
问题通过简单的代码描述如下(代码比较简单,未进行unlock操作,只是描述hibernate缓存的相关问题):
?
public void dealOrder(String orderCode){ Order order = orderService.getOrderByCode(orderCode); if(!lockService.lock(orderCode)){ order = orderService.getOrderByCode(orderCode); if(order!=null && order.getStatus()!=Order.FINISH){ OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService"); orderService.dealOrderOnly(order);//REQUEST_NEW,这个操作会改变order的状态 } } }??
这个代码在并发访问的时候会出现问题,在第二次获得对象前,必须evict或clear Order对象,否则,dealOrderOnly方法还是会执行两次。正确的代码如下:
public void dealOrder(String orderCode){ Order order = orderService.getOrderByCode(orderCode); if(!lockService.lock(orderCode)){ orderService.evict(order);//清空hibernate缓存 order = orderService.getOrderByCode(orderCode); if(order!=null && order.getStatus()!=Order.FINISH){ OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService"); orderService.dealOrderOnly(order);//REQUEST_NEW,这个操作会改变order的状态 } } }?