thinkphp3.2 多表事务的实例

多表事务不同于单表  

1.  需要使用空白的Model 来开启以及使用事务

2.   如果不是在Model里面, 需要使用  $model->table() 来进行insert update delelte操作 , 但是直接D() 操作试验了也是可以的

3. 如果是特定的Mysql链接在实例化 model的时候链接使用     eg :  M('','', 'MYSQL_CRSAPI)

4. 默认不支持嵌套 

            $db = M();
            $db->startTrans();

            $result1 = $db->Table('db_a')->update($field, 'what');
            $result2 = $db->Table('db_b')->update($field, 'happend');

            if($result1 && $result2){
                //提交  
                $db->commit();
            }
            else{
                //回滚  
                $db-


 $model = M('', '', 'MYSQL_CRSAPI');

    try {

        // 开启事务
        $model->startTrans();

        // check id
        $id = I('get.id', '' , 'intval');
        if (!$id) {
            throw new \Exception("请刷新页面后, 再次尝试编辑");
        }

        // init params
        $data = I('post.');
        $data['id'] = $id;

        // check property
        $data = D('AdminApikey')->filterData($data);

        // save account
        $account_data = [
            'owner' => $data['owner'],
            'active' => $data['active'],
            'apikey' => $data['apikey'],
            'validuntil' => $data['validuntil'],
            'updated_at' => time(),
        ];

        $account_save_result = $model->table('admin_apikey')->where("id=$id")->save($account_data);

        // save account property
        if ($account_save_result !== false) {
            $field_list = D('DictApictrlFields')
                ->where('status=1')
                ->field('name,remark')
                ->select();

            foreach ($field_list as $filed) {
                $index = $filed['name'];
                $property[$index] = isset($data[$index]) ? $data[$index] : '';
            }

            $property_result = D('AdminApictrl')->setInfo($id, $property);
        }

        // save api fields
        if (isset($property_result) && $property_result !== false) {
            $api_field_result = D('AdminApikeyFields')->updateInfo($id, $data['out_fields']);
        }
        $account_save_result = false;
        //  rollback where add action failed
        if ($account_save_result === false || !isset($property_result) || ($property_result === false) || !isset($api_field_result) || ($api_field_result === false)) {
            throw new \Exception('账户更新失败, 请重新尝试');
        }

    } catch (\Exception $e) {

        // rollback
        $model->rollback();
        $this->__Return($e->getMessage());
    }

    // commit
    $model->commit();
    $this->__Return('账号更新成功','', 'tip_success');
}

你可能感兴趣的:(thinkphp)