- 📖 序言
- 🚀 本地开发部署
- 🖥️ 服务器部署
- 📝 项目启动流程
- 📁 项目目录结构
- ☕ java 服务端
- 🎛️ 管理端前端
- 📱 手机端前端
- 🌐 web 端前端
- 🔧 代码生成器
- 🔌 API 接口
- 📦 插件开发
- ⚙️ 功能配置
事务管理
系统在开发过程中经常遇到整体的方法,这种方法由多个执行步骤,如果一个步骤出现问题,整体方法都要回滚之前的操作,防止出现脏数据,这个时候就要使用事务,比如订单创建,会员账户变动,添加用户以及关联角色等
事务配置
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);
}