thinkphp5 事务回滚实现方法

注意 使用tp5事务时 不要用db() 要用Db::name 或者 Db::table
 
 // 开启事务
        Db::startTrans();
        try {
            // 开启事务  Db::startTrans(); //写在这个位置也可以
        
            //任意一个表写入失败都会抛出异常:
            //比如加一个判断
            if (false) {
                throw new \Exception('操作失败'); //抛出错误
            }
 
            //根据 订单id 和门店 id 去判断 有没有分配分拣员
            $where_a['id'] = $post_data['order_id'];
//            $where_a['store_id'] = $post_data['store_id'];
            $find_storer = Db::name('shopro_order')->where($where_a)->value('storer_id');
 
            if(!$find_storer){ //没有分配的分拣员
                //先去判断有没有分拣员上班
                $storer_info = $this->get_assign_storer();
                if(!$storer_info){
                    throw new \Exception('无分拣员接单');
                }
                //第一步要去获取分拣员的数据  读取缓存数据
                $storer_id = $storer_info['id']; //分拣员id
                //先去分配分拣员
                $where_storer['order_id'] = $post_data['order_id'];
                $update_storer['storer_id'] = $storer_id;
                $re['storer'] = Db('shopro_order_son')->where($where_storer)->update($update_storer);
                //主表
                $where_order['id'] = $post_data['order_id'];
                $update_order['storer_id'] = $storer_id;
                $update_order['storer_state'] = 1;
                $update_order['storer_assign_time'] = date('Y-m-d H:i:s',time());
                $re['order'] = Db('shopro_order')->where($where_order)->update($update_order);
            }
            //去修改子订单表 clz_shopro_order_son
            $where_son['order_id'] = $post_data['order_id'];
            $where_son['store_id'] = $post_data['store_id'];
            $update_son['store_state'] = 2;
            $update_son['storer_state'] = 1;
            $update_son['store_stockup_time'] = date('Y-m-d H:i:s',time());
            $re['son'] = Db('shopro_order_son')->where($where_son)->update($update_son);
            //任意一个表写入失败都会抛出异常:
            if (in_array('0', $re)) { //  if ($res1==0 || $res2==0 ||$res3 == 0) {
                throw new \Exception('操作失败');//抛出错误
            }
            // 提交事务
            Db::commit();
            $this->return_data(1, '操作成功', true);
        } catch (\Exception $e) {
            // 回滚事务 如获取到异常信息,对所有表的删、改、写操作,都会回滚至操作前的状态:
            Db::rollback();
            $msg = $e->getMessage();
            $this->return_data(0, $msg, true);
        }
 
 
 
 
 
 
 
try {
                            //开启事物
                    Db::startTrans();
                    $res1 = Db:name('frieslandtravel_apply')->insert($add_apply);
                    $res2 = Db:name('frieslandtravel_apply_son')->insert($add_apply_son);
                    //任意一个表写入失败都会抛出异常:
                    if ($res1==0 || $res2==0) {
                        throw new \Exception('操作失败');//抛出错误
                    }
                    // 提交事务
                    Db::commit();
                    exit_json( init_err(0, '操作成功') );
                } catch (\Exception $e) {
                    // 回滚事务 如获取到异常信息,对所有表的删、改、写操作,都会回滚至操作前的状态:
                    Db::rollback();
                    exit_json( init_err(1, '操作失败') );
                }
 
 
 
 
if ( !function_exists('init_err') ) {
    function init_err($err=1, $msg='未知错误', $data=null)
    {
        return [
            'err' => $err,
            'msg' => $msg,
            'data' => $data,
        ];
    }
}
 
 
if ( !function_exists('exit_json') ) {
    /**
     * Desc:输出json字符串
     * Date:2021/1/31 14:55
     * Author: guanzy@huilan-online.com
     * --------------------------------
     * @param $data
     * --------------------------------
     */
    function exit_json($data)
    {
        exit( json_encode($data, 256) );
    }
}

 

 
posted @ 2022-04-30 08:58  hellyliu  阅读(377)  评论(0编辑  收藏  举报