Get your next remote job on LaraJobs.
Databases Laravel

Understanding database transactions with Laravel

Benjamin Crozat
Published on Aug 27, 2023 0 comments Edit on GitHub
Understanding database transactions with Laravel

What are database transactions?

When developing web applications, we frequently perform multiple operations on our database. As developers, we need to ensure that either all of these operations succeed, or in case of error, none of them do. This all-or-nothing principle is encapsulated in the concept of a database transaction (lots of databases support this concept, such as MySQL and PostgreSQL).

A database transaction is a sequence of one or more database operations executed as a unit of work. If any operation within the transaction fails (mostly in a context of high traffic), the entire transaction gets rolled back – in other words, none of the changes are applied. On the other hand, if all operations are successful, the transaction commits and all changes are saved to the database.

How Laravel simplifies database transactions

If you’ve worked with database transactions in raw SQL, you know handling them manually using “BEGIN TRANSACTION”, “COMMIT”, and “ROLLBACK” can be a bit repetitive. Luckily, Laravel simplifies transactions with its convenient DB::transaction() method.

With Laravel, you just pass a closure into DB::transaction(). The operations within the closure will be wrapped up in a database transaction. It couldn’t get easier!

Here’s some example code:

use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    $room = Room::find(1);

    // Create a booking for the room. Nothing fancy there.
    Booking::create([
        'user_id' => auth()->id(),
        'room_id' => $room->id,
    ]);

    // Create a payment for the room. If, for whatever reason, the
    // payment can't be created, the booking will be rolled back!
    Payment::create([
        'user_id' => auth()->id(),
        'room_id' => $room->rate,
    ]);
});

In this example, we’re performing two operations within a single transaction. We’re creating a new booking and recording a payment. If any of these operations fail, none of the changes will be saved to the database. This ensures our database remains in a consistent state under all circumstances.

Before we end, know that the DB::transaction() method accepts a second parameter, which is the number of times the process must be retried in case of failure.

use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    …
}, 3);

Learn more about transactions in Laravel on the official documentation.

Wait, there's more!

Be the first to comment!

Get help or share something of value with other readers!

Great deals for enterprise developers
  • ZoneWatcher
    Get instant alerts on DNS changes across all major providers, before your customers notice.
    25% off for 12 months using the promo code CROZAT.
    Try ZoneWatcher for free
  • Quickly build highly customizable admin panels for Laravel projects.
    20% off on the pro version using the promo code CROZAT.
    Try Backpack for free
  • Summarize and talk to YouTube videos. Bypass ads, sponsors, chit-chat, and get to the point.
    Try Nobinge →
  • Monitor the health of your apps: downtimes, certificates, broken links, and more.
    20% off the first 3 months using the promo code CROZAT.
    Try Oh Dear for free
  • Keep the customers coming; monitor your Google rankings.
    30% off your first month using the promo code WELCOME30
    Try Wincher for free →
The latest community links
- / -