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