@Transactional
public synchronized int addPiaojuOrder(WlcOrder wlcOrder, WlcPiaoju wlcPiaoju,
Double buyMoney) {
try {
//支付成功和下单未支付的总额
Double amount = wlcPiaojuService.getAllOrderAmountByPJId(wlcPiaoju.getId());
BigDecimal b1 = new BigDecimal(Double.toString(buyMoney));
b1 = b1.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal b2 = new BigDecimal(Double.toString(wlcPiaoju.getTotal()));
b2 = b2.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal b3 = new BigDecimal(Double.toString(amount));
b3 = b3.setScale(2, BigDecimal.ROUND_HALF_UP);
//购买时间已超过放款时间
if (wlcPiaoju.getLoansTime().getTime() - new Date().getTime() < 0) {
return 3;
}
//票据状态不在发售中
if (!"2".equals(wlcPiaoju.getProductStatus())) {
return 1;
}
//购买金额大于剩余金额 buyMoney > (wlcPiaoju.getTotal()-amount)
if (b1.compareTo(b2.subtract(b3)) > 0) {
return 2;
}
//订单满额锁定状态buyMoney == (wlcPiaoju.getTotal()-amount)
if (b1.compareTo(b2.subtract(b3)) == 0) {
wlcPiaoju.setProductStatus("6");
wlcPiaojuService.saveOrUpdate(wlcPiaoju);
}
wlcPiaojuService.saveOrder(wlcOrder);
//this.saveOrUpdate(wlcOrder);
return -1;
} catch (Exception e) {
e.printStackTrace();
logger.info("WlcOrderServiceImpl-------------------------addPiaojuOrder()出现异常======================" + e.getMessage());
return 2;
}
}
在以上的红色代码中,两个方法开始分别使用了hibernate机制,来查询订单总额和保存新的订单。
查询订单总额主要用于用于比较新的订单是否超过可买余额。但是在使用hibernate时间,由于取得的数据都是从缓存里面获取的,所以,出现了“冒顶”的情况。
开始以为bug的产生是由于同步没成功,最后经过几天的奋战,用JDBC来操作这两个方法。获得了成功。