2015-04-28 2 views
1

Поскольку у меня есть несколько функций, выполняющихся в следующем элементе управления как одна транзакция, я не мог окружить каждую функцию транзакцией в модели. Поэтому я сделал это следующим образом. Пожалуйста, дайте мне знать, если есть какие-либо проблемы. На данный момент работает нормально, но понятия не имеет, возникнет ли проблема параллелизма или есть какой-либо другой способ?Операция Codeigniter внутри элемента управления

if(isset($_POST['btnsave'])) 
     { 
      $mcodes = $_POST['tblmcode']; 
      $count = count($mcodes); 
      //echo $count; 

      $issue = new Materialissue_model(); 

      $this->db->trans_start(); //Here starts my transaction 
      $issue->setIssuecode($this->input->post('txtissuecode')); 

      if($issue->checkNoExistence()) { 

       $issue->setDate($this->input->post('txtdate')); 
       $issue->setCustomer($this->input->post('txtcustomer')); 
       $issue->setFromlocation($this->input->post('txtlocation')); 
       $issue->setResponsible($this->input->post('txtresponsible')); 
       $issue->setComments($this->input->post('txtcomments')); 
       $issue->setTotal($this->input->post('txttotal')); 
       $issue->setUser($this->session->userdata('username')); 
       $issue->setStatus($this->input->post('txtstatus')); 

       for ($i = 0; $i < $count; $i++) { 

        $issue->setMaterialcode($_POST['tblmcode'][$i]); 
        $issue->setMaterialname($_POST['tblmname'][$i]); 
        $issue->setCost($_POST['tblcost'][$i]); 
        $issue->setQty($_POST['tblqty'][$i]); 
        $issue->setSubtotal($_POST['tblsubtotal'][$i]); 
        $issue->saveIssueDetail(); 

        $stock = new Materialstock_model(); 
        $stock->setItemcode($_POST['tblmcode'][$i]); 
        $stock->setItemlocation($this->input->post('txtlocation')); 
        $stock->setQty($_POST['tblqty'][$i]); 
        $stock->setRefno($this->input->post('txtissuecode')); 
        $stock->setLasttransaction('MATERIAL-ISSUE'); 
        $stock->updateMaterialIssueStock(); 


        $transaction = new Transaction_model(); 
        $transaction->setDescription("MATERIAL-ISSUE"); 
        $transaction->setItemcode($_POST['tblmcode'][$i]); 
        $transaction->setRecqty("0"); 
        $transaction->setTransqty("0"); 
        $transaction->setIssueqty($_POST['tblqty'][$i]); 
        $transaction->setDate($this->input->post('txtdate')); 
        $transaction->setUser($this->session->userdata('username')); 
        $transaction->saveMaterialTransaction(); 


       } 

       $result = $issue->saveIssue(); 
       $this->db->trans_complete(); //Here ends my transaction 
       if ($result) { 

        $message = new Message_model(); 
        $data['message'] = $message->recordadded; 
        $data['type'] = "success"; 
        $data['returnpage'] = base_url() . "index.php/materialissue_control/show"; 
        $data["print"] = base_url() . "index.php/Notegenerator_control/showMaterialIssueNote?code=".$issue->getIssuecode(); 
        $this->load->view('messageprint_view', $data); 

       } 

      }else{ 

       $message = new Message_model(); 
       $data['message'] = $message->issuecodeexists; 
       $data['type'] = "error"; 
       $data['returnpage'] = base_url() . "index.php/materialissue_control/show"; 
       $this->load->view('message_view', $data); 


      } 

     } 

ответ

0

Я предпочитаю использовать триггер для обработки многих функций в одном контроллере, что делает мой код чистым и легким для отслеживания. Например: пользователь пишет статью, это действие вызовет одно действие в модели write_article, объединяющееся с 1 транзакцией, но эта функция запускает любой запрос: 1.insert post 2.lock count post category 3.lock count user post 4. блокировка полезных сообщений по дате например, в коде

public function write_article($post) { 
    $this->cms->db->trans_start(TRUE); 
     $this->cms->db->set('content', $posts->get_content()); 
     $this->cms->db->insert('t_posts'); 
    $this->cms->db->trans_complete(); 
    if($this->cms->db->trans_status() === TRUE){ 
     $this->cms->db->trans_commit(); 
    }else{ 
     $this->cms->db->trans_rollback(); 
    } 
} 

Эта ссылка о триггере www.sitepoint.com/how-to-create-mysql-triggers

Смежные вопросы