Double Booking Problem

May 2, 2024

Cover image for Double Booking Problem

Booking.com, Airbnb, Calendly, and 42Mentors all do the same thing - they help you book stuff:

  • Meetings with important people
  • Hotel rooms, meals, and fun activities

But these websites all face one BIG problem: the double booking nightmare. 😱

Booking website example

The Double Booking Problem

Picture this: Two people are on the same website at the exact same time. Both want to book a haircut on April 18 at 8:00 PM. Both click the big "Book Now" button at the same moment. Without special protection, the system might say "YES!" to both people.

Now the poor hairdresser has two customers showing up at the same time! One happy customer, one angry customer. Not good! 😬

Luckily, smart databases like PostgreSQL and MySQL have secret weapons to fight this problem.

Using SELECT ... FOR UPDATE

Most coders know how to write normal SELECT queries like this one. But not everyone knows about the magic FOR UPDATE words that can prevent double booking disasters!

PostgreSQL explains all about SELECT in its documentation. The powerful FOR UPDATE feature is explained in the Locking Clause section.

SELECT ... FOR UPDATE doesn't just get information - it also LOCKS it, preventing others from changing it at the same time. It works in three simple steps:

  1. Row Locking – The selected row gets a "DO NOT TOUCH" sign on it
  2. Transaction Scope – The lock stays active until you're done with your changes
  3. Concurrent Modification – While you're working, anyone else trying to modify the same data has to wait their turn

Let's See It In Action

Let's use JavaScript with PostgreSQL to see how this works. First, create a simple table in your database:

Now, let's create a route in Express.js to see all available slots:

The Booking Problem

Now, let's create a route to book a slot using its id and the customer's name:

This code looks good at first glance, but it has a HUGE problem: we haven't used FOR UPDATE yet!

If two people try to book the same slot at the same time, both might see it's available, both will try to book it, and BOOM - double booking disaster! 💥

The Solution: Transactions & FOR UPDATE

Let's fix our code with transactions and the magic FOR UPDATE clause:

The Magic Explained

That small change - adding transactions and FOR UPDATE - makes all the difference! Now when User A and User B try to book the same slot at the exact same time:

  1. User A's query gets there first and LOCKS the row with FOR UPDATE
  2. User B's query has to wait patiently until User A is done
  3. User A books the slot and finishes their transaction
  4. User B's query finally runs, but now the slot is already booked, so they get an error message

No more double bookings! 🎉

Final Thoughts

This approach works great, but it does have some downsides. If you have LOTS of people trying to book things at once, the FOR UPDATE locks might slow your system down a bit.

For most apps, this solution is perfect. But for super high-traffic sites (like Airbnb during holiday season), you might need even more advanced techniques.

If you found this helpful, please share it with your friends who are building booking systems! And remember, a little SQL magic can save you from big booking headaches! 🧙‍♂️