2016-12-26 17 views
0

我想在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; 
} 

在此先感謝!

+0

簡單它會得到保存。似乎在你的代碼中沒有回滾。一旦達到第一次返回,它將終止下面的所有代碼並返回輸出。 –

+0

閱讀此https://codeigniter.com/userguide3/database/transactions.html和這個http://stackoverflow.com/questions/15224826/codeigniter-transactions/34695559#34695559 –

+0

不,我已經測試過了。它回滾save_company的更改。 save_company只是將一條記錄添加到數據庫中。當我剛剛返回時,我看不到db中的記錄。所以我總結它自動回滾,因爲它沒有達到$ this-> db-> trans_complete();如果我沒有使用$ this-> db-> trans_start();在方法開始時,我會希望它的行爲與您所建議的類似,但這是不同的。在這種情況下,我說我負責事務管理,既不完成也不回滾,我只是回來。我想知道這個具體情況。 – gurkan

回答

0

你嘗試喜歡這個....

下面的代碼,如果交易完成successfully.Otherwise它rollback您的交易並返回FALSE。希望它會幫助你很多返回TRUE ..

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; 
} 
相關問題