Ikki marta band qilish tekshiruv bilan emas, indeks bilan tuzatiladi
SQLSQLitePythonСостояние гонки
Stol band qilish botida vazifa oddiy ko'rinadi: bitta stolni bir vaqtga ikki marta band qilishga yo'l qo'ymaslik.
Birinchi yechim o'zi keladi: yozishdan oldin bazadan so'rash, slot bo'shmi. U noto'g'ri va noto'g'riligi ko'rinmaydi. So'rov bilan yozuv orasida vaqt o'tadi.
To'g'ri joy — bazaning o'zi. Stol, sana va vaqt bo'yicha unikal indeks ikkinchi qatorni jismonan yozdirmaydi.
Bitta nozik joy — bekor qilingan bronlar. Ularni indeksga kiritsangiz, bekor qilingan stolni qayta band qilib bo'lmaydi. Qisman indeks buni hal qiladi.
Umumiy qoida: agar taqiq doim amal qilishi kerak bo'lsa, uning joyi bazada, dastur kodida emas.
SQL
1-- Один столик нельзя занять дважды на один и тот же слот.2-- Отменённые брони из проверки исключаются.3--4-- Проверять занятость запросом перед вставкой ненадёжно: между5-- проверкой и записью успевает вклиниться второй гость. Здесь6-- запрет живёт в самой базе, и обойти его нельзя.7CREATEUNIQUEINDEXIFNOTEXISTSidx_booking_slot8ONbookings (table_id, book_date, book_time)9WHEREstatus <> 'cancelled';