Codeigniter Operazioni

Sto utilizzando Codeigniter operazioni

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

Questo funziona bene , il problema che ho è che all’interno del trans_start e trans_complete sto chiamando altre funzioni e le funzioni offerte con database in modo che contiene inserti e di aggiornamento e alcuni elimina … ex:

$this->db->trans_start();
 $this->utils->insert_function($data);
 $this->utils->update_function2($test);
$this->db->trans_complete();

Ora, se queste funzioni vengono eseguite e alcuni errori si verificano CodeIgniter non fare un rollback.

Qual è il modo migliore per affrontare tale problema?

L’unica soluzione che ho in mente, è quello di restituire un errore da quelle funzioni e all’interno di quei funzione add (trans_stat e trans_complete) E se restituisce un errore di provare un’fare $this->db->trans_rollback

ex:

    $this->db->trans_start();
     $result = $this->utils->insert_function($data);
     if($result === false){
       $this->db->trans_rollback();
     }
    $this->db->trans_complete();

C’è un modo migliore di fare questo?

Aggiornamento 1:

Come richiesto un campione della funzione esterna sto chiamando :

   //insert_function contains

    $rec = array(
        'numero' => $numero,
        'transaction_id' => $id,
        'debit' => $product_taxes['amount_without_taxes'],
        'date' => $data['date_transaction'],
    );
    $this->addExerciceAccountingRecords($rec);

  and addExerciceAccountingRecords contains

   function addExerciceAccountingRecords($records) {
    $this->db->insert('transactions_exercices', $records);
    }
  • Cosa Storage Engine stai usando per il tuo tabelle MySQL? Inoltre, come fai a sapere che il rollback non è riuscito?
  • INNODB , lo so perché Quando c’è un rollback non è applicato le tabelle modificate durante la chiamata di funzione all’interno del trans_start
  • Puoi postare il codice per utils->insert_function e utils->insert_function2 ? Ho un idea di ciò che il problema potrebbe essere…
  • Ho Aggiornato la mia domanda.
  • Ancora una domanda: è utils nella cartella delle librerie?
  • sì , contiene aiutanti funzioni
  • Dammi un paio di minuti per scrivere una risposta per voi…
  • Io suggerirei fino diritto di voto tutte le risposte che hai trovato utili
  • Esempio roytuts.com/codeigniter-transaction-example/

InformationsquelleAutor Tarek | 2013-03-05

 

6 Replies
  1. 36

    Utilizzando transactions significa database di supporto per l’inserimento di dati in modo sicuro. Così in Codeigniter scriviamo ogni database relative funzioni in Modello non in un Controller.. E nel suo secondo codice(che non funziona)si hanno sottolineato modello in là.(utils). Così semplice, io sono sicuro che questo non funzionerà. Perché il suo non è un inserimento di dati con il modello e il Controller parallelo. Transazione devono essere codificate nel Modello(scriverò nel Modello la mia risposta).


    Carico di questo stoffe e

    1. Libreria Di Database
    2. Modello Di Classe
    3. URL helper
    4. Sessione

    Ipotesi

    Nel tuo codice hai usato $data e $test come array. Quindi immagino che non c’è due array per l’inserimento e l’aggiornamento dei dati.


    Il set di dati

    $data = array(
       'title' => 'My title' ,
       'name' => 'My Name' ,
       'date' => 'My date'
    );
    
    $id = 007;
    $test = array(
       'title' => $title,
       'name' => $name,
       'date' => $date
    );

    Codice

    $this->db->trans_start(); # Starting Transaction
    $this->db->trans_strict(FALSE); # See Note 01. If you wish can remove as well 
    
    $this->db->insert('table_name', $data); # Inserting data
    
    # Updating data
    $this->db->where('id', $id);
    $this->db->update('table_name', $test); 
    
    $this->db->trans_complete(); # Completing transaction
    
    /*Optional*/
    
    if ($this->db->trans_status() === FALSE) {
        # Something went wrong.
        $this->db->trans_rollback();
        return FALSE;
    } 
    else {
        # Everything is Perfect. 
        # Committing data to the database.
        $this->db->trans_commit();
        return TRUE;
    }

    Note

    1. Per impostazione predefinita Codeigniter esegue tutte le operazioni in Modalità Rigorosa. Quando
      la modalità strict è abilitato, se sono in esecuzione più gruppi di operazioni, se un gruppo non riesce a tutti i gruppi verrà eseguito il rollback. Se
      la modalità strict è disabili
      , ogni gruppo è trattati
      indipendentemente
      , significato di un fallimento di un gruppo non influisce
      altri
      .
    • trans_complete() fa già un controllo di stato e di rollback/commit
    • Perché la rimozione di questi ?? non entrano in Conflitto con il contenuto
    • quei pochi lin ho modificato è stato per il manuale di transazione.vedere la documentazione per la vostra auto codeigniter.com/user_guide/database/transactions.html
    • bro gestire gli errori. Controllare questo codeigniter.com/user_guide/database/…
    • se trans_complete() si impegna automaticamente, in “ALTRO” caso commettere di nuovo…non credi che sia un problema !
    • ci sono due opzioni seguenti – 1) rimuovere la condizione else o 2) rimuovere $this->db->trans_complete(), si prega di controllare il manuale & aggiornare il tuo [email protected]
    • assicurarsi di utilizzare $this->db->trans_begin() durante l’esecuzione manuale di operazioni, NON $this->db->trans_start().
    • Perché? Quando si tratta di esaminare il codice, trans_start() effettivamente chiamate trans_begin() con stessi parametri e non vi è alcun ulteriore controllo in essere. Forse la leggibilità.
    • nel mio caso voglio fare ordine in quel momento un ordine di ordine multiplo elemento nella tabella separata in modo che quando faccio ordine voglio transazione. passo-1: sono in ordine di inserimento nella tabella di ordine. passo-2: basato su inserito id l’utilizzo, nella tabella articolo è più un ordine. quando l’ordine elemento inserito io per controllare la disponibilità di tempo se la posizione dell’ordine di quantità non disponibile voglio il rollback di tutte le transazioni, ma $this->db->trans_status() sempre vero come può farlo. ho Provate un sacco ma non funziona quando la disponibilità di esito negativo ho appena $this->db->trans_rollback(); ma non può rotolare indietro

  2. 5

    Cosa che ho provato è stato più di un trucco, ma ha funzionato per me.

    $this->db->trans_begin();
      $rst1=  $this->utils->insert_function($data);
      $rst2 =  $this->utils->update_function2($test);
    if($this->db->trans_status() === FALSE || !isset($rst1) || !isset($rst2)){
       $this->db->trans_rollback();
    }else{
       $this->db->trans_commit();
    }
  3. 3

    Ho il sospetto che il problema ha a che fare con CodeIgniter è la movimentazione di oggetti.

    Se si va la CI la documentazione sotto la sezione “Creazione di Librerie” a:

    http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html

    e guardate la sezione relativa a:

    $CI =& get_instance();
    $CI->load->helper('url');
    $CI->load->library('session');
    $CI->config->item('base_url');

    Nel controller principale, è stato caricato/istanziato la classe database utilizzando automatico di carico o esplicitamente il caricamento di classe.

    Quindi, andare avanti e aprire la transazione, e poi, puoi accedere al tuo database
    funzioni attraverso il vostro utils biblioteca.

    Tuttavia, una volta che si utilizza $this-db in libreria, in realtà si accede a un’altra copia dell’istanza di database, NON quello che è associato con la vostra transazione.

    Di accesso alla stessa istanza, è necessario utilizzare il get_instance() funzione.

    Penso che dovrebbe risolvere il tuo problema. Originale stile di codifica per separare la funzione di
    in diversi moduli, è eccellente. Hai semplicemente bisogno di capire questo dettaglio aggiuntivo.

    Si prega di provare e confermare che il roll back funziona come previsto.

    Il coraggio di codice si compone dei seguenti controller:

    $this->db->trans_start();
    $this->User_profile_m->create_new_user_profile();
    $this->User_profile_m->create_new_user();
    $this->db->trans_complete(); 

    e un modello semplice user_profile_m per affrontare la persistenza dei dati:

    function create_new_user()
    {
        $data['user_name_usr'] = $this->input->post('user_name');
        $data['create_date_usr'] = NULL;
    
        $this->db->insert('user_usr', $data);  
    }
    
    function create_new_user_profile()
    {
        $data['user_name_pro'] = $this->input->post('user_name');
        $data['user_description_pro'] = $this->input->post('user_description');
        $data['create_date_pro'] = NULL;
    
        $this->db->insert('user_profile_pro', $data);  
    }

    Essenzialmente, la dimostrazione che cerca di fare due inserti (uno in ciascuna delle due tabelle).
    Se l’inserto non riesce, l’altro è il rollback.

    Ho costruito questo in CodeIgniter 2.1.3 e posso fare le file dell’applicazione disponibile tramite GitHub o zip in su e inviare a voi.

    • Scusa forse ho dato un cattivo esempio , il problema si verifica anche se la funzione di inserimento è lo stesso modello e la chiamo da ($this->insertFunction…)
    • Ciao Tarek, hai provato get_instance() ? Io sono un po ‘ incuriosito da questo; non stai facendo nulla di fuori dall’ordinario. Fammi pensare a questo più di una tazza di caffè, si prega di check-in più tardi di oggi.
    • Audet: quando l’operazione di aggiornamento return 0 (riga interessata) allora transazione è rollback o no? Grazie.
    • Buona domanda. Si dovrebbe davvero essere il controllo $this->db->trans_status() invece di $this->db->affected_rows(), dal momento che la riga interessata risultato può variare a seconda esattamente dove è posto l’istruzione (all’interno o all’esterno del blocco di transazioni).
  4. 3

    Provare questa procedura. È veramente il lavoro per me 🙂

    $this->db->trans_start();
       $this->utils->insert_function($data);
       $this->utils->update_function2($test);
    if($this->db->trans_status() === FALSE){
       $this->db->trans_rollback();
    }else{
       $this->db->trans_complete();
    }
    • trans_complete() fa già un controllo di stato e di rollback/commit
  5. 2


    Nota: assicurarsi di utilizzare $this->db->trans_begin() durante l’esecuzione manuale di operazioni, NON $this->db->trans_start().

    $this -> db -> trans_begin(); 
    $this -> utils -> insert_function ( $data );
    $this -> utils -> update_function2 ( $test ); 
    $this -> db -> trans_complete ();

    Certificare nel caso di uso di MySql, uso in InnoDb Formato

    • Ora è lavorare per voi?
  6. 0

    Per singolo inserire o aggiornare i record, è possibile utilizzare affected_rows funzione

    $this->db->insert('table_name', xss_clean($data));
    
    
    //Check if there is a record affected
    if($this->db->affected_rows() > 0)
                  {
                      return true;
                  }
                  else
                  { 
                      //if not succeeded
                      //check your last query 
                      die($this->db->last_query());
                  }

Lascia un commento