Codeigniter-Transaktionen

Lesezeit: 8 Minuten

Codeigniter Transaktionen
Tarek

Ich verwende Codeigniter-Transaktionen

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

Das funktioniert gut, das Problem, das ich habe, ist, dass innerhalb der trans_start und trans_complete Ich rufe andere Funktionen auf und diese Funktionen befassen sich mit der Datenbank, sodass sie Einfügungen und Aktualisierungen und einige Löschungen enthalten … z. B.:

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

Wenn nun diese Funktionen ausgeführt werden und einige Fehler auftreten, führt CodeIgniter kein Rollback durch.

Was ist der beste Weg, um mit einem solchen Problem umzugehen?

Die einzige Lösung, die ich im Sinn habe, besteht darin, einen Fehler von diesen Funktionen zurückzugeben und innerhalb dieser Funktion add (trans_stat und trans_complete) Und wenn es einen Fehlertest zurückgibt, tun Sie es $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();

Gibt es einen besseren Weg, dies zu tun?

Aktualisierung 1:

Wie angefordert ein Beispiel der externen Funktion, die ich aufrufe:

   // 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);
    }

  • Welche Speicher-Engine verwenden Sie für Ihre MySQL-Tabellen? Woher wissen Sie auch, dass das Rollback fehlgeschlagen ist?

    – Marc Audet

    5. März 13 um 17:48 Uhr

  • @MarcAudet INNODB , ich weiß, weil When there is a rollback nicht auf Tabellen angewendet wird, die während des Funktionsaufrufs innerhalb von trans_start geändert wurden

    – Tarek

    5. März ’13 um 18:00 Uhr

  • Können Sie den Code an utils->insert_function und utils->insert_function2 posten? Ich habe eine Ahnung woran es liegen könnte…

    – Marc Audet

    5. März 13 um 18:03 Uhr

  • @MarcAudet Ich habe meine Frage aktualisiert.

    – Tarek

    5. März 13 um 18:09 Uhr


  • Noch eine Frage: Ist utils im Libraries-Ordner?

    – Marc Audet

    5. März 13 um 18:15 Uhr

Codeigniter Transaktionen
Abdulla Nilam

Verwenden transactions bedeutet Unterstützungsdatenbanken, um Daten sicher einzufügen. Also schreiben wir in Codeigniter jeden datenbankbezogene Funktionen in der Modell nicht im Controller.. Und in Ihrem zweiten Code (der nicht funktioniert) haben Sie auf das Modell verwiesen. (utils). So einfach bin ich mir sicher, dass das nicht funktionieren wird. Weil es keine Einfügedaten mit Modell und Controller parallel sind. Die Transaktion sollte im Modell codiert werden (Ich werde in meiner Antwort in Modell schreiben).


Laden Sie diese Sachen auch

  1. Datenbankbibliothek
  2. Modellklasse
  3. URL-Helfer
  4. Sitzung

Annahmen

In Ihrem Code haben Sie verwendet $data und $test als Array. Ich gehe also davon aus, dass es zwei Arrays zum Einfügen und Aktualisieren von Daten gibt.


Ihre Datensätze

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

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

Dein Code

$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;
}

Anmerkungen

  1. Standardmäßig führt Codeigniter alle Transaktionen im Strict Mode aus. Wann
    strenger Modus ist aktiviert, wenn Sie mehrere Gruppen von Transaktionen ausführen, werden alle Gruppen zurückgesetzt, wenn eine Gruppe fehlschlägt. Wenn strenger Modus ist behindert, jede Gruppe ist selbstständig behandelt, Das heißt, ein Ausfall einer Gruppe wirkt sich nicht auf andere aus.

  • trans_complete() führt bereits eine Statusprüfung und Rollback/Commit durch

    – Alex

    1. August 16 um 6:10 Uhr

  • @AL-zami Warum entfernst du die?? Widersprechen Sie nicht dem Inhalt

    – Abdulla Nilam

    25. August 16 um 9:00 Uhr


  • @spartan diese wenigen Zeilen, die ich bearbeitet habe, waren für manuelle Transaktionen bestimmt. Sehen Sie sich die Dokumentation selbst an codeigniter.com/user_guide/database/transactions.html

    – AL-zami

    25. August 16 um 12:43 Uhr

  • @AL-zami bro es, um Fehler zu verwalten. Überprüfen Sie dies codeigniter.com/user_guide/database/…

    – Abdulla Nilam

    25. August 16 um 14:58 Uhr

  • Stellen Sie sicher, dass Sie $this->db->trans_begin() verwenden, wenn Sie manuelle Transaktionen ausführen, NICHT $this->db->trans_start().

    – Schihas

    13. Oktober 16 um 8:31 Uhr


Was ich versucht habe, war eher ein Trick, aber es hat bei mir funktioniert.

$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();
}

1643911448 203 Codeigniter Transaktionen
Marc Audet

Ich vermute, dass das Problem damit zu tun hat, wie CodeIgniter mit Objekten umgeht.

Wenn Sie in der CI-Dokumentation unter dem Abschnitt “Creating Libraries” unter:

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

und schauen Sie sich den Abschnitt an, der sich auf Folgendes bezieht:

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

In Ihrem Hauptcontroller haben Sie die Datenbankklasse entweder durch automatisches Laden oder explizites Laden der Klasse geladen/instanziiert.

Sie fahren dann fort und öffnen die Transaktion, und dann greifen Sie über Ihre utils-Bibliothek auf Ihre Datenbankfunktionen zu.

Allerdings, sobald Sie verwenden $this-db In Ihrer Bibliothek greifen Sie tatsächlich auf eine andere Kopie der Datenbankinstanz zu, NICHT auf die, die Ihrer Transaktion zugeordnet ist.

Um auf dieselbe Instanz zuzugreifen, müssen Sie die Funktion get_instance() verwenden.

Ich denke das sollte dein Problem beheben. Ihr origineller Programmierstil, um Funktionen in verschiedene Module aufzuteilen, ist ausgezeichnet. Sie müssen dieses zusätzliche Detail einfach verstehen.

Bitte versuchen Sie und bestätigen Sie, dass das Rollback wie erwartet funktioniert.

Der Kern des Codes besteht aus dem folgenden Controller:

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

und ein einfaches Modell user_profile_m Umgang mit Datenpersistenz:

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);  
}

Im Wesentlichen versucht die Demonstration, zwei Einfügungen vorzunehmen (eine in jeder von zwei Tabellen). Wenn eine Einfügung fehlschlägt, wird die andere rückgängig gemacht.

Ich habe dies in CodeIgniter 2.1.3 erstellt und kann die Anwendungsdateien über GitHub verfügbar machen oder sie komprimieren und an Sie senden.

  • Entschuldigung, vielleicht habe ich ein schlechtes Beispiel gegeben, das Problem tritt auch dann auf, wenn sich die Einfügefunktion im selben Modell befindet und ich sie mit ($this->insertFunction…) aufrufe.

    – Tarek

    6. März 13 um 13:16 Uhr

  • Hallo Tarek, hast du get_instance() versucht? Ich bin ein bisschen neugierig darauf; Du machst nichts Außergewöhnliches. Lassen Sie mich bei einer Tasse Kaffee darüber nachdenken, bitte schauen Sie später noch heute vorbei.

    – Marc Audet

    6. März 13 um 15:38 Uhr

  • @Marc Audet: Wenn der Aktualisierungsvorgang 0 zurückgibt (betroffene Zeile), ist die Transaktion ein Rollback oder nicht? Danke.

    – geheimnis

    5. Mai 13 um 15:17 Uhr

  • @secretim Gute Frage. Du solltest wirklich nachsehen $this->db->trans_status() anstatt $this->db->affected_rows(), da das betroffene Zeilenergebnis variieren kann, je nachdem, wo genau Sie die Anweisung platzieren (innerhalb oder außerhalb des Transaktionsblocks).

    – Marc Audet

    5. Mai 13 um 20:51 Uhr

1643911449 352 Codeigniter Transaktionen
Diego

Hinweis: Unbedingt verwenden $this->db->trans_begin() beim Ausführen manueller Transaktionen NICHT $this->db->trans_start().

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

Zertifizieren Sie, falls Sie MySql verwenden, verwenden Sie im InnoDb-Format

Probieren Sie dieses Verfahren aus. Es funktioniert wirklich für mich 🙂

$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() führt bereits eine Statusprüfung und Rollback/Commit durch

    – Alex

    1. August 16 um 6:10 Uhr

1643911449 88 Codeigniter Transaktionen
bdalina

Für einzelne Einfügungs- oder Aktualisierungsdatensätze können Sie die betroffene_Zeilen-Funktion verwenden

$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());
              }

  • trans_complete() führt bereits eine Statusprüfung und Rollback/Commit durch

    – Alex

    1. August 16 um 6:10 Uhr

.

758420cookie-checkCodeigniter-Transaktionen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy