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.:
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
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
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
Datenbankbibliothek
Modellklasse
URL-Helfer
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.
$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
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
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:
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
Diego
Hinweis: Unbedingt verwenden $this->db->trans_begin() beim Ausführen manueller Transaktionen NICHT $this->db->trans_start().
trans_complete() führt bereits eine Statusprüfung und Rollback/Commit durch
– Alex
1. August 16 um 6:10 Uhr
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
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