当模型函数在达到回滚或完成之前返回时,插入的记录会发生啥?
Posted
技术标签:
【中文标题】当模型函数在达到回滚或完成之前返回时,插入的记录会发生啥?【英文标题】:What happens to inserted records when a model function returns before it reaches to rollback or complete?当模型函数在达到回滚或完成之前返回时,插入的记录会发生什么? 【发布时间】:2017-05-11 02:52:23 【问题描述】:我正在尝试在 codeigniter 中测试事务管理。下面的方法是模型类中的一个函数。如果 update_user_company_id 方法返回 false,则包装方法 save_user_and_company 也返回。在这种情况下,因为方法在到达之前返回
$this->db->trans_complete();
调用,save_company 和 delete_company_requests 方法所做的更改被回滚。这就是我要的。
但我想学习的是,而不是调用
$this->db->rollback();
我直接从方法返回。 这种方法安全吗? 以后有没有可能遇到锁或其他问题?
function save_user_and_company($user, $company_request)
$result[STATU] = ERROR;
$this->db->trans_start();
$company = $this->companies_dao->save_company($company_request->company_name, $user->id);
if (!$company)
$result[MESSAGE] = COMPANY_SAVE_ERROR;
return $result;
$company_request_result = $this->company_requests_model->delete_company_requests($company_request->id);
if (!$company_request_result)
$result[MESSAGE] = COMPANY_REQUEST_DELETE_ERROR;
return $result;
$user_update = $this->users_dao->update_user_company_id($user->id, $company->id);
if (!$user_update)
$result[MESSAGE] = USER_UPDATE_ERROR;
return $result;
$this->db->trans_complete();
$result[STATU] = SUCCESS;
$result[MESSAGE] = SUCCESSFUL;
return $result;
提前致谢!
【问题讨论】:
简单保存。您的代码中似乎没有回滚。一旦达到第一次返回,它将终止以下所有代码并返回输出。 阅读这个codeigniter.com/userguide3/database/transactions.html和这个***.com/questions/15224826/codeigniter-transactions/… 没有,我又测试过了。它回滚 save_company 的更改。 save_company 只是将一条记录添加到数据库中。当我在它之后返回时,我在 db 中看不到任何记录。所以我断定它会自动回滚,因为它没有达到 $this->db->trans_complete();如果我没有使用 $this->db->trans_start();在方法的开始,我希望它的行为就像你建议的那样,但这是不同的。在这种情况下,我说我负责事务管理,既不完成也不回滚,我只是返回。我想知道这个具体案例。 【参考方案1】:你试过这样吗……
如果交易成功完成,以下代码返回TRUE
。否则rollback
您的交易并返回FALSE
。希望对您有很大帮助..
function save_user_and_company($user, $company_request)
$this->db->trans_begin(); //Begins your transaction
//Performs the transaction operations
$company = $this->companies_dao->save_company($company_request->company_name, $user->id);
$company_request_result = $this->company_requests_model->delete_company_requests($company_request->id);
$user_update = $this->users_dao->update_user_company_id($user->id, $company->id);
//Check whether transaction fails
if ($this->db->trans_status() === FALSE)
$this->db->trans_rollback();
$status = FALSE;
else
$this->db->trans_commit();
$status = TRUE;
return $status;
【讨论】:
以上是关于当模型函数在达到回滚或完成之前返回时,插入的记录会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章