Bir sinema salonu koltuk rezervasyon sistemi, birden fazla kullanıcının aynı koltukları rezerve etmesini nasıl önler?


34

Sinema salonuna gidiyorum, istediğiniz koltukları seçmenizi sağlayan bilet kioskları var; Ayrıca aynı şeyi yapan bir web sitesine de sahipler (web sitesinde ayrıca 30 saniye gibi bir geri sayım sayacı da mevcut.)

Veri tabanı işlemleri ve aynı anda birden fazla kullanıcıyı idare etmek için diğer teknikler gibi şeyleri anlasam da, birden fazla kişinin aynı anda nasıl bir koltuk seçmesine izin verilebileceğini düşünemiyorum; AL tuşuna basan ilk kişi koltukları alıyor mu, diğer kişi bir hata mesajı alacak mı, yoksa bir şey mi eksik?


10
"AL tuşuna basan ilk kişi koltukları alır ve diğer kişi bir hata mesajı alır." Yani.
yannis

2
Evet, muhtemelen, bir düzine makineyle dolu, acayip bir günde, sanırım acıtır gibi görünüyor.
Mbasi

2
Belki de, ancak kullanıcıların zamanlarının çoğunu diğer ekranlara (ödeme ayrıntılarını girerek, bilet yazdırmayı beklemek vb.) Harcayacağını unutmayın, bu nedenle hepsi aynı anda koltuk seçmeyeceklerdir. herkesin aynı koltuk tercihleri ​​vardır, bu nedenle aynı zamanda toplananlar bile farklı koltuklar seçebilir. O kadar çok çarpışma olmasını beklemiyorum.
Dave Sherohman

2
@JimG. Her olası çözüm için, her iki müşterinin de aynı anda (milisaniyeye kadar) aynı anda satın alması durumunda, biri hizmet alacak ve diğeri bir çeşit hata mesajı alacaktır. Olma olasılığını en aza indirmenin güzel yolları var (cevaplarda açıklandığı gibi teknik ve kavramsal) ancak olağanüstü durumda gerçekleşirse bir istek karşılanır ve diğeri başarısız olur. Kadar basit.
yannis

3
@JimG. Bu bir tür davranış değil. Eşzamanlılık bir noktaya kadar çalışır, eğer her iki talep de aynı miktara ulaştığında, başarısız olur. Elbette, Hand-E-Food'un yorumunda olduğu gibi, bunun etrafında güzel bir hata mesajı oluşturabilirsiniz, ancak gerçek şu: Bir isteğe cevap vermek ve diğerini başarısız olmak kadar basit. Başarısızlığın olabildiğince kullanıcı dostu olmasını sağlamak için her şeyi yapmamanız gerektiğini veya bunun etrafında korunmamanız gerektiğini söylemiyorum.
yannis

Yanıtlar:


27

Bunu yapmanın klasik yöntemi, işlemsel bir veritabanı kullanmaktır (bu nedenle çakışma olmaz) ve koltuğun size belirli bir süre sonra (örneğin, kiosklar için 10 dakika) süresinin dolmasıyla ilgili geçici bir tahsisat yapmaktır . maaş. (Müşterinin görebileceği) işlemi düşerse veya zaman aşımına uğrarsa, koltuk tahsisi tekrar havuza bırakılabilir. (Tüm durum değişiklikleri işlem veritabanı aracılığıyla işlenir ve müşterinin görebileceği bir işlem birçok veritabanı düzeyinde işlem gerektirebilir.)

Havayolları, online rezervasyon koltukları için benzer bir sistem kullanacaktır (birden fazla uçuş ayağının üstesinden gelmek zorunda kalması nedeniyle çok daha karmaşık!). Zaman aşımının çok daha uzun olacağını hayal ediyorum; Uçak bileti genellikle sinema biletlerinden önceden rezervasyon yaptırır ve daha pahalıdır.


Dikkat et, yerel sinema salonum normalde koltuk ayırmıyor. Bunun yerine, koltukları çok fazla hazırladılar, böylece insanlar sadece en az telaşa yol açabileceklerdi. Bu farklı bir teknik, ancak sorunuzla alakalı değil!
Donal Fellows

Spor etkinlikleri için koltuk toplama benzer. N koltuk sayısını 3 dakika boyunca ayırıp, gerçekten isteyip istemediğinize karar verirsiniz ve ödemeyi tamamlarsınız.
AndyMcKenna

Örneğin, havayolu koltukları satın almak için iki farklı işlem olduğunu unutmayın: ilk önce, koltuk ayırmadan bir bilet alırsınız. İkincisi, biniş kartınızı aldığınızda (ya da çevrimiçi check-in yaparsanız) bir koltuk alırsınız. Bilet sayıları gerçekte fazla satılıyor çünkü ortalama olarak belirli bir sayı uçuş için görünmüyor. Bununla birlikte, koltuk tahsisi, check-in sırasında size bir koltuk (ilk gelene ilk hizmet veren) rastgele atanarak ve ardından uygun bir tane seçerek ve ardından tek bir işlemle transfer yaparak koltuk değiştirmenize izin vererek işe yarıyor gibi görünüyor. .
Scott Whitlock

2
@DonalFellows geçici tahsisat bölümünü biraz daha açıklayabilir misiniz? Bir kullanıcı için bir süre koltuk ayırmayı mı kastediyorsunuz? Hala bu tür sistemlerde karşılaştığım zorlukları aşmaya çalışıyorum.
Sandeepan Nath

1
@SandeepanNath Bir yorumda düzgün değil, ancak ilke önemsiz. Koltuk, “geçici olarak tahsis edilmiş” bir duruma getirilir ve bu durumun zaman aşımı aynı anda not edilir. Rezervasyon tamamlanırsa koltuk tamamen tahsis edilir. Değilse ve zaman aşımına ulaşılmışsa, koltuk (nihayetinde) ana havuza geri taşınır. (Ayrıca, kullanıcı açıkça iptal ederse, koltuk doğrudan havuza taşınır. Beklemenize gerek yoktur.)
Donal Fellows

4

Gördüğünüz 30 saniye, günümüzde genellikle 15 dakika gibi. Bu süre için aktif bir veritabanı işlemi olduğuna inanmıyorum.

Eğer böyle bir sistemi tasarlamak isteseydim, bunu nasıl yapardım: İş nesnesi var Bookingve Reservation. Rezervasyonlar esasen teyit edilir (yani ücretli). Onları aynı DB tablosunda saklar ve bir ya da iki öznitelikle ayırt ederdim.

Mevcut koltukları alırken, hem rezervasyonları hem de rezervasyonları sorgulayabilirsiniz.

Birisi bir koltuk seçtiğinde, yeni bir rezervasyon yaratırsınız, böylece diğer müşterilere oturduğu yeri gösterir. Aynı koltuk için ikinci bir rezervasyon reddedilecek - DB güncellemesi veya eklemesi başarısız olacaktır. Müşteri rezervasyonu onaylarsa / öderse, rezervasyona geçersiniz. Periyodik bir toplu işde, 15 dakikadan daha eski olan tüm rezervasyonları (veya müşterilerinize ne zaman verirseniz verin) silersiniz.



1

Burada en az 2 iş süreci var.

  • Birinci işlem:

Mevcut koltukları göster.

  • İkinci işlem:

Seçili koltuk için yer ayırtın.

Bu süreçler birbirini çok fazla takip etmediğinden ve 2 kişi aynı sandalyeyi seçebileceğinden eşzamanlılık sorunu ortaya çıkmaktadır.

Eğer veritabanı tasarımınız doğru benzersiz kısıtı atarsa, aşağıdakilerin birleşimi:

-TheaterID

-SeatID

-EventID

benzersiz, sonra veritabanı çiftleri önleyecektir.

Aşağıdaki senaryo da mümkündür ancak yukarıda belirtilen uygulamalarla halledilir:

Belirli bir tiyatro ve belirli bir etkinlik için uygun bir ızgara görüntüsü varsayalım:

  1. Kullanıcı1 mevcut koltukları gösterir (ve 1 ve 2 numaralı koltukları alır)
  2. Kullanıcı2 mevcut koltukları gösterir (ve 1 ve 2 numaralı koltukları alır)
  3. Kullanıcı1 telefonda müşteri ile biraz konuşuyor
  4. Kullanıcı2 gider ve müşterisi için 2. koltukta yer alır
  5. Kullanıcı1 müşterisi için 2. koltukta rezervasyon yapmaya çalışır (çünkü ekranda mevcut olduğunu gösterir)
  6. Benzersiz dizin, 5. adımın verileri değiştirmesini önler.

Bu yüzden yapmanız gereken tek şey daha doğru bir veritabanı tasarımı ve kısıtlamalara uygun bir seçim olamaz.

İşlem kuyruklarını kullanarak isterseniz daha karmaşık yaklaşımlar da mümkündür. Bu durumda, talepler önce bir kuyruğa yazılır, sonra her n saniyede bir işlem başlatır, ancak bu sizin durumunuzda pek gerekli veya pratik değildir.

Gerçekten ilginç olan kısım, kullanıcı 1 için liste kılavuzunun göstermesi gereken şey nedir?


1

Belirli koltukları tahsis etmeyi geciktirirseniz, yarış koşullarından kaçınabilirsiniz.

  1. Müşteriden oturma tercihleri ​​toplayın (koltuk sayısı, fiyat, tiyatro alanı, bitişik koltuk zorunlu, vb.)
  2. İstenen oturma tercihlerini bir sıraya kaydedin
  3. Birer birer oturma talepleri kuyruktan çekilir, tercihe göre ayrılan koltuklar ve koltuk bulunursa rezervasyon tamamlanır.
  4. Rezervasyon tamamlandığında müşterileri ve posta biletlerini bildirin; Aksi takdirde, müşteriye hiçbir tercihin eşleştiğini bildirme.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.