tp6shop --Singwa–9-13
注意数据库要是支持回滚的innoDb ,不要是MyISAM
首先开启事务
$this->model->startTrans();
Db::startTrans();
然后try catch
提交
$this->model->commit();
有任何一个发生错误就触发回滚
$this->model->rollback();
测试可以把每一个sql结果打印出来,并给其中一个sql结果空值
<?php
/**
*Create By Msy
*User: Msy
*Date: {2020/6/12}
*Time: {10:40}
*Ps: 现在的努力就是为了年轻时吹的一手牛逼。
*/
namespace app\common\business;
use app\common\model\mysql\Goods as GoodsModel;
class Goods extends BusBase
{
public $model = null;
public function __construct()
{
$this->model = new GoodsModel();
}
public function insertData($data)
{
$this->model->startTrans();//开启事物
try {
//插入到Goods表
$goodsId = $this->add($data);
if (!$goodsId) {
return false;
}
//插入到Goods_sku表
//如果是统一规格
if ($data['goods_specs_type'] == 1) {
$goodsSkuData = [
'good_id' => $goodsId,
];
} else if ($data['goods_specs_type'] == 2) {
$goodsSkuObj = new GoodsSku();
$data['goods_id'] = $goodsId;
$res = $goodsSkuObj->saveAll($data);
if (!empty($res)) {
//总库存
$stock = array_sum(array_column($res, 'stock'));//返回的插入SKU表的库存和
$goodsUpdateData = [
'stock' => $stock,
'price' => $res[0]['price'],
'cost_price' => $res[0]['cost_price'],
'sku_id' => $res[0]['id'],
];
$goodsRes = $this->model->updateById($goodsId, $goodsUpdateData);
if (!$goodsRes) {
throw new \think\Exception('商品信息回填失败');
}
}
else {
throw new \think\Exception('SKU信息添加错误');
}
}
$this->model->commit(); //提交事物
return true;
}catch (\Exception $e){
//事物回滚
$this->model->rollback();
return false;
}
return true;
}
}