事务管理
系统在开发过程中经常遇到整体的方法,这种方法由多个执行步骤,如果一个步骤出现问题,整体方法都要回滚之前的操作,防止出现脏数据,这个时候就要使用事务,比如订单创建,会员账户变动,添加用户以及关联角色等
事务配置
niucloud 使用 springboot 已经集成了事务的方法,只需要在方法前增加注解 @Transactional 即可,例如支付方法
/**
* 支付
*
* @param param
* @return
*/
@Override
@Transactional
public Object pay(PayParam param) {
Pay pay = this.checkOrCreate(param.getTradeType(), param.getTradeId());
if (pay.getBody().length() > 15) {
pay.setBody(pay.getBody().substring(0, 15) + "...");
}
param.setPay(pay);
param.setNotifyUrl(buildNotifyUrl(param.getChannel(), param.getType(), "pay"));
BasePay driver = this.driver(param.getChannel(), param.getType());
Map<String, Object> json = new HashMap<>();
json.put("openid", param.getOpenid());
pay.setJson(JSONUtil.toJsonStr(json));
this.payMapper.updateById(pay);
return driver.pay(param);
}
推荐使用事务尽量避免嵌套使用,同时事务中尽量不包含查询操作只需要处理数据修改或者删除操作
例如订单,相关的业务数据在事务之前已经查询组装,事务中只需要对订单添加或者修改处理即可
/**
* 创建订单
*
* @param vo
* @return
*/
protected OrderCreateResultVo createOrder(OrderCreateDataVo vo, MallOrder order, List<MallOrderGoods> orderGoods) {
// 添加订单表
order.setCreateTime(System.currentTimeMillis() / 1000);
mallOrderMapper.insert(order);
vo.setOrderId(order.getOrderId());
// 添加订单项表
for (MallOrderGoods item : orderGoods) {
item.setOrderId(order.getOrderId());
item.setStatus(1);
mallOrderGoodsMapper.insert(item);
}
}