多表事务不同于单表
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-<rollback() }
$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'); }