当模型函数在达到回滚或完成之前返回时,插入的记录会发生啥?

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_companydelete_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;

【讨论】:

以上是关于当模型函数在达到回滚或完成之前返回时,插入的记录会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

关于MySQL回滚机制

安卓 back4app。如何回滚或何时是提交点(事务控制)

IO模型

SQLServer之创建DML AFTER INSERT触发器

Spring单元测试用例没有回滚插入记录

开启事务/结束事务