Când o acțiune implică modificarea mai multor tabele corelate (de exemplu: scăderea banilor dintr-un cont și creditarea celuilalt cont), eșecul unei singure comenzi SQL poate lăsa baza de date într-o stare coruptă.
Metoda DB::transaction(Closure) încapsulează logica într-o tranzacție SQL atomică: dacă totul reușește, se execută COMMIT. Dacă apare vreo excepție, se execută instantaneu ROLLBACK, anulând toate modificările parțiale.
Exemplu: Transfer bancar securizat cu DB::transaction și blocare la citire
use Illuminate\Support\Facades\DB;
public function transferFunds(int $fromId, int $toId, float $amount)
{
DB::transaction(function () use ($fromId, $toId, $amount) {
$fromAccount = DB::table('accounts')->where('id', $fromId)->lockForUpdate()->first();
if ($fromAccount->balance < $amount) {
throw new \Exception('Fonduri insuficiente!');
}
DB::table('accounts')->where('id', $fromId)->decrement('balance', $amount);
DB::table('accounts')->where('id', $toId)->increment('balance', $amount);
DB::table('transfers')->insert([
'from_id' => $fromId,
'to_id' => $toId,
'amount' => $amount,
'created_at' => now(),
]);
}, 5); // Reîncearcă de maxim 5 ori în caz de Deadlock
}
Întrebări & Exemple de Cod:
Tranzacții SQL sigure cu DB::transaction() în LaravelAi o nelămurire despre utilizarea comenzii
Tranzacții SQL sigure cu DB::transaction() în Laravelsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.