Kenapa Double Booking Bisa Terjadi
Skenario: dua pelanggan tanya "ada slot besok jam 10:00?" dalam waktu 3 detik berdekatan. Tanpa locking, sistem akan:
- Pelanggan A tanya → AI cek slot kosong → offer 10:00
- Pelanggan B tanya → AI cek slot kosong → offer 10:00 (slot belum di-book A)
- Pelanggan A konfirmasi → slot 10:00 ke-book untuk A
- Pelanggan B konfirmasi → slot 10:00 ke-book lagi untuk B → CONFLICT
Solusinya: locking.
Strategi Locking
1. Pessimistic Locking
Saat AI offer slot, segera lock di database. Tipikal SQL:
BEGIN TRANSACTION; SELECT * FROM slots WHERE id = ? FOR UPDATE; -- check if not locked UPDATE slots SET locked_by = ?, locked_until = NOW() + INTERVAL 5 MINUTE WHERE id = ?; COMMIT;
Saat pelanggan lain query slot yang sama, akan dilihat status lock dan tidak akan ditawarkan.
2. Optimistic Locking
Pakai version field di setiap slot. Saat update, cek version match.
UPDATE slots SET booked_by = ?, version = version + 1 WHERE id = ? AND version = ?;
Kalau version sudah berubah (ada yang book duluan), update fail dan pelanggan disuruh ulang.
3. Distributed Lock (Redis)
Untuk sistem terdistribusi, pakai Redis SETNX dengan TTL:
SET slot:lock:2026-07-28-10:00 user_123 NX EX 300
Kalau berhasil set, lock dipegang. Kalau gagal, slot sudah di-lock pelanggan lain.
Implementasi di Flow Booking AI
- Pelanggan request slot → AI query availability
- AI iterasi list slot kosong, untuk tiap slot: try lock (timeout 5 menit)
- Tampilkan ke pelanggan hanya slot yang berhasil di-lock
- Pelanggan pilih + konfirmasi → lock jadi permanent booking
- Pelanggan timeout (5 menit tidak respon) → lock dilepas otomatis
Edge Case yang Sering Bocor
- Admin booking manual: ketik booking langsung di Google Calendar, bypass AI. Pastikan semua jalur lewat sistem yang sama.
- Crash saat locking: kalau server crash setelah lock, slot akan stuck. Pakai TTL agar lock auto-release.
- Slot bentrok dengan event lain: pastikan AI baca semua event di kalender, bukan hanya booking AI.
- Reschedule yang race condition: pelanggan A reschedule, B booking slot baru. Pastikan reschedule lock slot lama dan baru sekaligus.
Testing Anti Double Booking
Sebelum live, lakukan stress test:
- Simulasi 10 pelanggan request slot sama bersamaan
- Cek hanya 1 yang berhasil book
- Sisanya dapat pesan "slot baru saja diambil, mau pilih yang lain?"
UX Saat Slot Diambil Pelanggan Lain
Jangan tampilkan error teknis. Lebih baik:
Maaf kak, slot 10:00 baru saja diambil pelanggan lain. Yang masih tersedia: 10:30, 11:00, 11:30. Mau pilih yang mana?
Lebih natural dan pelanggan tidak kesal.
Monitor Metrik
- Rate konflik lock per hari (idealnya < 1%)
- Average lock duration (target < 2 menit)
- Failed booking karena timeout (kalau tinggi, perpanjang TTL)
