Antworten:
Du kannst das:
DB::transaction(function() {
//
});
Alles innerhalb des Abschlusses wird innerhalb einer Transaktion ausgeführt. Wenn eine Ausnahme auftritt, wird automatisch ein Rollback durchgeführt.
Discussed in more detail here
Link ist tot.
Wenn Sie keine anonymen Funktionen mögen:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
Update : Für Laravel 4 ist das pdo
Objekt nicht mehr öffentlich, also:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
DB::beginTransaction()
& DB::commit()
& verwenden DB::rollback()
. Das wäre etwas sauberer.
DB::connection()->getPdo()->beginTransaction();
DB::transaction
Rückruf mit noch sauberer ist, aber der Nachteil ist, dass Sie, wenn Sie verschiedene Handler für verschiedene Ausnahmen angeben müssen, zur Try / Catch-Technik zurückkehren müssen
Wenn Sie Eloquent verwenden möchten, können Sie dies auch verwenden
Dies ist nur ein Beispielcode aus meinem Projekt
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
question->id
Ausdruck beim Transaktionsrückruf gibt Null zurück.
Wenn Sie Verschlüsse vermeiden möchten und gerne Fassaden verwenden, hält Folgendes Folgendes für schön und sauber:
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
Wenn Anweisungen fehlschlagen, wird Commit niemals ausgeführt und die Transaktion wird nicht verarbeitet.
Ich bin sicher, Sie suchen keine Verschlusslösung. Versuchen Sie dies für eine kompaktere Lösung
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
Aus irgendeinem Grund ist es ziemlich schwierig, diese Informationen irgendwo zu finden, deshalb habe ich beschlossen, sie hier zu veröffentlichen, da mein Problem, obwohl es sich auf eloquente Transaktionen bezog, dies genau änderte.
Nach der Lektüre THIS Stackoverflow Antwort, erkannte ich meine Datenbank - Tabellen MyISAM statt InnoDB verwendet wurden.
Damit Transaktionen auf Laravel (oder an einem anderen Ort, wie es scheint) funktionieren, müssen Ihre Tabellen InnoDB verwenden
Warum?
Zitieren von MySQL- Transaktionen und Atomic Operations- Dokumenten ( hier ):
MySQL Server (Version 3.23-max und alle Versionen 4.0 und höher) unterstützt Transaktionen mit den Transaktionsspeicher-Engines InnoDB und BDB. InnoDB bietet vollständige ACID-Konformität. Siehe Kapitel 14, Speichermotoren. Informationen zu InnoDB-Unterschieden zu Standard-SQL in Bezug auf die Behandlung von Transaktionsfehlern finden Sie in Abschnitt 14.2.11, „InnoDB-Fehlerbehandlung“.
Die anderen nicht-transaktionalen Speicher-Engines in MySQL Server (wie MyISAM) folgen einem anderen Paradigma für die Datenintegrität, das als "atomare Operationen" bezeichnet wird. In transaktionaler Hinsicht arbeiten MyISAM-Tabellen effektiv immer im Autocommit = 1-Modus. Atomoperationen bieten häufig eine vergleichbare Integrität bei höherer Leistung.
Da MySQL Server beide Paradigmen unterstützt, können Sie entscheiden, ob Ihre Anwendungen durch die Geschwindigkeit atomarer Operationen oder die Verwendung von Transaktionsfunktionen am besten bedient werden. Diese Auswahl kann pro Tabelle getroffen werden.
Wenn eine Ausnahme auftritt, wird die Transaktion automatisch zurückgesetzt.
Laravel Basic Transaktionsformat
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}