Double Booking Problem

May 2, 2024

Cover image for Double Booking Problem

Booking.com, Airbnb, Calendly va 42Mentors bularni barchasi bir toifadagi ishni bajaradi ya'ni siz uchun

  • Uchrashuvlarni
  • Ovqat, turar joy va boshqa turdagi narsalarni

band qila oladi. Ularda eng kam va shu o'rinda uchrashi mumkin bo'lgan eng yomon muammo bu double booking problem xisoblanadi.

Picture about Booking

Double Booking Problem

Tasavvur qiling siz yaratgan tizimga ikki inson bir vaqtda kirishdi. Ikkisiga ham aynan 18-Aprel 20:00 vaqti yoqdi va buyurtma qilish tugmachasiga bosdi. Agar siz bunga qarshi chora ko'rmagan bo'lsangiz tizim ikkisiga ham muvaffaqiyatli buyurtma qildingiz deya javob qaytaradi. Ammo bu juda yomon 😢

Bu muammoni hal qilish uchun baxtimizga PostgreSQL, MySQL kabi katta ma'lumotlar omborini yaratgan va contribute qilgan insonlar yechim berishgan.

SELECT ... FOR UPDATE

Yuqorida keltirlgan selectni hammamiz bilamiz menimcha, ammo FOR UPDATE qo'shimchasi haqida katta ehtimol bilan eshitmaganmiz (chunki ishimiz tushmaganligidan bo'lsa kerak albatta).

Postgres o'z dokumentatsiyasida SELECT haqida juda ko'p zo'r ma'lumotlar bergan. SELECT ... FOR UPDATE haqida esa The Locking Clause bo'limida yoritib berishgan.

SELECT ... FOR UPDATE bu ham biror qator tanlash uchun ishlatiladi ammo oddiy tanlabgina qo'ymay o'sha qatorni qulflab ham qo'yadi (locks the row) ya'ni concurrency problem oldini olish uchun. Ishlash jaryoni 3 bosqichda amalga oshadi:

  1. Row locking -- siz tanlagan qatorni tanlaydi va uni ustida operatsiyalar bajarlimasligi uchun uni yopadi.
  2. Transaction scope -- boshlangan transaction rollback yoki commit qilinmagunicha yopiq saqlab turadi.
  3. Concurrent Modification -- manashu transaction tugamagunicha boshqa tranzaksiyalarni bloklaydi.

Amaliyot

Amaliyot uchun JavaScript va Postgresql dan foydlansak bo'ladi. Amaliyotdan avval ma'lumotlar omboriga ushbu queryni ma'lumotlar omboringizga kiritib, ozgina ma'lumotlar qo'shib oling.

PostgreSQL serverni ishga tushuring va Epxress JS da slots nomli route yarating. Ushbu route ni vazifasi barcha mavjud slotlarni qaytarishdir!

Endi navbat band qilish qismiga, id va name bilan band qilish uchun query yozamiz:

Demak hammasi tayyor! Dastur zo'r ishlaydi deb turgan vaqtingizda bir muammo bor biz hali ham FOR UPDATE ishlatmadik. Agar ikkita browser oyansini ochib, debugger ishlatib ularni bir vaqtda book qilsangiz ikki insonga ham bir xil muvaffaqiyatli degan javob qaytaradi.

Ammo bu muammoni TRANSACTION va FOR UPDATE orqali bloklashimiz va yechishimiz mumkin!

Mana ko'rib turibsizki muammoni ozgina ish bilan hal qila oldik.

Albatta buni ham o'ziga yarasha yomon tomonlari mavjud, ular haqida ko'proq dokumentatsiya o'qish va tajriba qilib ko'rishni tavsiya qilaman.

Postni foydali topgan bo'lsangiz, o'zingiz ham o'rganing va tanishlaringizga ham o'rgating (share qiling)!