用Tp开发程序的时候你应该也遇到过事务提交后没有生效,或者是事务走成功后又走了catch里的rollback

许多人在开发的时候喜欢把$this->success()或者$this->error()写在事务处理里面。其实这个方法是不对的。看启蒙博客写法如何解决在事务中的问题。
Db::starttrans();
try{
$sendStr='';
for($i=0;$i<$total;$i++){

$sendStr .= $recordCon[$i]['name']."批号:".$recordCon[$i]['low_id']."数量:". $recordCon[$i]['num']."\n\r";

//判断状态是否闲置
$highInfo = $High->where('id',$recordCon[$i]['low_id'])->where('status','idle')->lock(true)->find();

if($highInfo==false){
$result = $highInfo['name'] . "不是闲置资产,或者已被其他人申请:";
throw new \think\Exception($result, 100);
}
//库存数量充足开始改资产
$highData['warehouse_id'] = $AdminInfo['warehouse_id'];
$highData['status'] = 'use';
$highData['user_id'] = $AdminInfo['id'];
$highResult = $High->where('id',$recordCon[$i]['low_id'])->update($highData);

if($highResult==false){
throw new \think\Exception('资产更改失败请联系管理员处理', 100);
}

//开始增加申请记录
$recordData[$i]['name'] = $recordCon[$i]['name'];
$recordData[$i]['assets_id'] = $recordCon[$i]['low_id'];
$recordData[$i]['num'] = $recordCon[$i]['num'];
$recordData[$i]['create_time'] = time();

//开始增加资产流水记录
$stream[$i]['assets_id'] = $recordCon[$i]['low_id'];
$stream[$i]['num'] = $recordCon[$i]['num'];
$stream[$i]['user_id'] = $AdminInfo['id'];
$stream[$i]['status'] = 'reduce';
$stream[$i]['create_time'] = time();
$stream[$i]['note'] = '资产申请';


}


//开始发钉钉通知
$DingResult = $this->sendDingTalk($sendStr,$param['userid'],$AdminInfo);

if($DingResult->errcode!=0)
{
throw new \think\Exception("钉钉推送审批失败,联系管理员处理", 100);
}


//添加资产流水记录
$StreamResult = $Stream->insertAll($stream);

if($StreamResult==false){
throw new \think\Exception("资产流水记录添加失败,联系管理员处理", 100);
}


//耗材申请记录
$data['process_instance_id'] = $DingResult->process_instance_id;
$data['user_id'] = $AdminInfo['id'];
$data['assets_type'] = 'high';
$data['create_time'] = time();
$data['user_id'] = $AdminInfo['id'];
$data['warehouse_id'] = $AdminInfo['warehouse_id'];
$data['name'] = $param['note'];
$data['house_id'] = isset($param['house_id'])?$param['house_id']:1;
$RecordResult = $Record->insertGetId($data);

if($StreamResult==false){
throw new \think\Exception("资产申请记录添加失败,联系管理员处理", 100);
}

for($i=0;$i<$total;$i++){
$recordData[$i]['record_id'] = $RecordResult;
}

$RecordDetailResult = $RecordDetail->insertAll($recordData);
if($RecordDetailResult==false){
throw new \think\Exception("资产申请记录详情添加失败,联系管理员处理", 100);
}


Db::commit();
$result = true;
}catch(\Exception $e){
Db::rollback();
$result=false;
$this->msg = $e->getMessage();
};

if($result)
$this->success("添加成功");
else
$this->error($this->msg);
以上代码所有返回错误的地方都加了
throw new \think\Exception("资产申请记录添加失败,联系管理员处理", 100);
不知道是否有人注意到在代码里启蒙博客有用到
->lock(true)
这个是为了防止并发加的锁

最后记住在成功和失败的地方我们不要用$this->success()或者$this->error()

这里我们直接复制一个变量成功就返回true失败就返回false,在最终来做这个判断。

点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部