ระบบการจองที่นั่งในโรงภาพยนตร์นั้นป้องกันผู้ใช้หลายคนจากการจองที่นั่งเดิมอย่างไร


34

ในโรงภาพยนตร์ฉันไปที่ตู้ขายตั๋วที่ให้คุณเลือกที่นั่งที่คุณต้องการ พวกเขายังมีเว็บไซต์ที่ทำเช่นเดียวกัน (เว็บไซต์นั้นมีตัวจับเวลานับถอยหลังเช่น 30 วินาทีซึ่งคุณต้องเลือกที่นั่ง)

ในขณะที่ฉันเข้าใจสิ่งต่าง ๆ เช่นธุรกรรมฐานข้อมูลและเทคนิคอื่น ๆ สำหรับการจัดการผู้ใช้หลายคนพร้อมกันฉันก็ไม่สามารถเข้าใจได้ว่าผู้ใช้หลายคนสามารถเลือกที่นั่งพร้อมกันได้อย่างไร มันง่ายเหมือนคนแรกที่กดซื้อ BUY รับที่นั่งและคนอื่นจะได้รับข้อความแสดงข้อผิดพลาดหรือฉันขาดอะไรไป?


10
"มันง่ายเหมือนคนแรกที่กดซื้อได้ที่นั่งและคนอื่นจะได้รับข้อความแสดงข้อผิดพลาด" ที่.
yannis

2
อาจจะใช่ในวันที่ยุ่งเหยิงด้วยเครื่องจักรที่ดูเหมือนว่าจะเป็นความเจ็บปวด
mbwasi

2
บางที แต่โปรดจำไว้ว่าผู้ใช้จะใช้เวลาส่วนใหญ่บนหน้าจออื่น (ป้อนรายละเอียดการชำระเงินรอตั๋วพิมพ์ ฯลฯ ) ดังนั้นพวกเขาจะไม่เลือกที่นั่งในเวลาเดียวกันทั้งหมดและไม่ใช่ ทุกคนมีที่นั่งที่เหมือนกันดังนั้นแม้แต่คนที่กำลังเลือกในเวลาเดียวกันก็อาจเลือกที่นั่งที่ต่างกันได้ ฉันไม่คาดหวังว่าจะมีการชนกันมากมาย
Dave Sherohman

2
@JimG สำหรับวิธีแก้ปัญหาที่เป็นไปได้หากลูกค้าทั้งสองกดซื้อในเวลาเดียวกัน (เป็นมิลลิวินาที) หนึ่งรายการจะได้รับบริการและอีกรายการหนึ่งจะได้รับข้อความแสดงข้อผิดพลาดบางประเภท มีวิธีที่สวยงามในการลดโอกาสที่จะเกิดขึ้น (ด้านเทคนิคและแนวคิดตามที่อธิบายไว้ในคำตอบ) แต่ในสถานการณ์พิเศษมันจะเกิดขึ้นจากนั้นจะมีการร้องขอหนึ่งครั้งและอีกอันจะล้มเหลว ง่ายเหมือนที่
yannis

3
@JimG มันไม่ใช่พฤติกรรมประเภทหนึ่ง การทำงานพร้อมกันทำงานได้ถึงจุดหนึ่งหากการร้องขอทั้งสองถึงที่ microtime ที่เหมือนกันการร้องขอนั้นจะล้มเหลว แน่นอนคุณสามารถสร้างข้อความแสดงข้อผิดพลาดที่ดีเช่นเดียวกับในความคิดเห็นของ Hand-E-Food แต่ความจริงก็ยังคงอยู่: มันง่ายเหมือนการให้บริการหนึ่งคำขอและล้มเหลวอื่น ๆ ฉันไม่ได้บอกว่าคุณไม่ควรทำทุกอย่างเพื่อให้มั่นใจว่าการล้มเหลวนั้นง่ายต่อการใช้งานอย่างที่ควรจะเป็นหรือคุณไม่ควรปกป้องมัน
yannis

คำตอบ:


27

วิธีคลาสสิกในการทำเช่นนี้คือการใช้ฐานข้อมูลธุรกรรม (ดังนั้นจึงไม่มีการปะทะกัน) และทำการจัดสรรที่นั่งให้กับคุณซึ่งจะหมดอายุหลังจากระยะเวลาหนึ่ง (เช่น 10 นาทีสำหรับซุ้ม) ที่ให้เวลากับคุณ การจ่ายเงิน หากธุรกรรม (ที่ลูกค้ามองเห็น) ตกผ่านหรือหมดเวลาการจัดสรรที่นั่งสามารถถูกปล่อยกลับเข้าไปในกลุ่มได้ (การเปลี่ยนแปลงสถานะทั้งหมดถูกประมวลผลผ่านฐานข้อมูลธุรกรรมและธุรกรรมหนึ่งที่ลูกค้าเห็นได้อาจต้องใช้ธุรกรรมระดับฐานข้อมูลจำนวนมาก)

สายการบินจะใช้ระบบที่คล้ายกัน (แม้ว่าจะมีความซับซ้อนมากกว่าเดิมเนื่องจากจำเป็นต้องจัดการกับเที่ยวบินหลายขา!) สำหรับการจองที่นั่งออนไลน์ ฉันคิดว่าการหมดเวลาจะนานกว่านี้มาก ตั๋วเครื่องบินมักจะถูกจองล่วงหน้ามากกว่าตั๋วหนังและมีราคาแพงกว่าเช่นกัน


ในใจคุณโรงภาพยนตร์ท้องถิ่นของฉันไม่ได้จัดสรรที่นั่งตามปกติ แต่พวกเขาจัดสรรที่นั่งมากเกินไปเพื่อให้ผู้คนสามารถหงุดหงิดน้อยที่สุด มันเป็นเทคนิคที่แตกต่างกัน แต่ไม่มีใครเกี่ยวข้องกับคำถามของคุณ!
Donal Fellows

คล้ายกับการเลือกที่นั่งสำหรับการแข่งขันกีฬา คุณได้รับจำนวนที่นั่ง N ที่สงวนไว้เป็นเวลา 3 นาทีในขณะที่คุณตัดสินใจว่าคุณต้องการที่นั่งเหล่านั้นและชำระเงินให้เสร็จสมบูรณ์หรือไม่
AndyMcKenna

โปรดทราบว่ามีกระบวนการที่แตกต่างกันสองกระบวนการด้วยเช่นการซื้อที่นั่งของสายการบินก่อนอื่นคุณต้องซื้อตั๋วโดยไม่ต้องจัดสรรที่นั่ง ประการที่สองเมื่อคุณได้รับบอร์ดดิ้งพาส (หรือเช็คอินออนไลน์) จากนั้นคุณจะได้ที่นั่ง จำนวนตั๋วถูกขายเกินจริงเพราะพวกเขารู้ว่าโดยเฉลี่ยแล้วจำนวนหนึ่งไม่ปรากฏขึ้นสำหรับเที่ยวบิน ดูเหมือนว่าการจัดสรรที่นั่งจะทำงานโดยการสุ่มกำหนดที่นั่ง (มาก่อนได้ก่อน) เมื่อคุณเช็คอินจากนั้นให้คุณเปลี่ยนที่นั่งโดยเลือกที่นั่งที่มีอยู่จากนั้นทำการโอนในธุรกรรมเดียว .
Scott Whitlock

2
@ DonalFellows คุณช่วยอธิบายการจัดสรรเบื้องต้นได้อีกเล็กน้อยหรือไม่? คุณหมายถึงการจองที่นั่งสำหรับผู้ใช้เป็นระยะเวลาหนึ่งหรือไม่? ฉันยังคงพยายามที่จะเผชิญกับความท้าทายในระบบประเภทนี้
Sandeepan Nath

1
@SandeepanNath ไม่ถูกต้องในความคิดเห็น แต่หลักการเป็นเรื่องเล็กน้อย ที่นั่งถูกกำหนดให้อยู่ในสถานะ“ จัดสรรอย่างไม่แน่นอน” และการหมดเวลาของสถานะนั้นจะถูกบันทึกในเวลาเดียวกัน หากการจองเสร็จสมบูรณ์ที่นั่งจะถูกจัดสรรอย่างสมบูรณ์ หากไม่ถึงและหมดเวลาที่นั่งจะถูกย้ายกลับเข้าไปในกลุ่มหลัก (นอกจากนี้หากผู้ใช้ยกเลิกอย่างชัดเจนที่นั่งจะถูกย้ายกลับเข้าไปในสระโดยตรงไม่จำเป็นต้องรอ)
Donal Fellows

4

ทุก ๆ 30 วินาทีที่คุณได้เห็นในปัจจุบันมักจะเป็นเช่น 15 นาที ฉันไม่เชื่อว่ามีการทำธุรกรรมฐานข้อมูลที่ใช้งานในช่วงเวลานั้น

ถ้าฉันก็คือการออกแบบระบบดังกล่าวนี้เป็นวิธีที่ฉันจะทำ: มีวัตถุธุรกิจและBooking Reservationการจองได้รับการยืนยันเป็นหลัก (เช่นชำระเงิน) การจอง ฉันจะเก็บไว้ในตารางฐานข้อมูลเดียวกันและแยกแยะคุณลักษณะหรือสอง

เมื่อดึงข้อมูลที่นั่งว่างคุณจะสอบถามทั้งการจองและการจอง

เมื่อมีคนเลือกที่นั่งคุณจะสร้างการจองใหม่ซึ่งจะเป็นการแสดงที่นั่งให้ลูกค้ารายอื่น ๆ การสำรองที่นั่งครั้งที่สองสำหรับที่นั่งเดียวกันจะถูกปฏิเสธ - การอัพเดตหรือการแทรก DB จะล้มเหลว หากลูกค้ายืนยัน / ชำระเงินสำหรับการจองคุณเปลี่ยนไปเป็นการจอง ในงานแบทช์เป็นระยะคุณลบการจองทั้งหมดที่เก่ากว่า 15 นาที (หรือเวลาใดก็ตามที่คุณให้ลูกค้าของคุณ)



1

มีกระบวนการทางธุรกิจอย่างน้อย 2 กระบวนการที่เกี่ยวข้องที่นี่

  • กระบวนการที่หนึ่ง:

แสดงที่นั่งว่าง

  • กระบวนการที่สอง:

จองที่นั่งที่เลือก

เนื่องจากกระบวนการเหล่านี้ไม่ได้ติดตามกันอย่างไม่สุภาพและเนื่องจาก 2 คนอาจเลือกที่นั่งเดียวกันที่มีปัญหาเกิดขึ้นพร้อมกัน

หากการออกแบบฐานข้อมูลของคุณกำหนดข้อ จำกัด ที่ไม่ซ้ำกันที่ถูกต้องเพื่อให้การรวมกันของ:

-TheaterID

-SeatID

-EventID

ไม่ซ้ำกันจากนั้นฐานข้อมูลจะป้องกันการซ้ำซ้อน

สถานการณ์ต่อไปนี้เป็นไปได้เช่นกัน แต่จะได้รับการดูแลโดยการนำไปปฏิบัติที่แนะนำข้างต้น:

สมมติว่ามุมมองกริดที่มีให้สำหรับโรงละครที่กำหนดและเหตุการณ์ที่กำหนดสามารถแสดงได้:

  1. User1 แสดงที่นั่งว่าง (และรับที่นั่ง 1 และ 2)
  2. User2 แสดงที่นั่งว่าง (และรับที่นั่ง 1 และ 2)
  3. User1 พูดกับลูกค้าทางโทรศัพท์เล็กน้อย
  4. ผู้ใช้ไปที่ 2 และจองที่นั่ง 2 สำหรับลูกค้าของเขา
  5. ผู้ใช้ 1 พยายามจองที่นั่ง 2 สำหรับลูกค้าของเขา (เพราะมันแสดงให้เห็นว่ามีอยู่บนหน้าจอของเขา)
  6. ดัชนีที่ไม่ซ้ำกันป้องกันขั้นตอนที่ 5 จากการเดินทางข้อมูล

ดังนั้นสิ่งที่คุณต้องทำอาจจะไม่มีอะไรที่ถูกต้องในการออกแบบฐานข้อมูลและทางเลือกที่เหมาะสมกับข้อ จำกัด

วิธีการที่ซับซ้อนกว่านี้เป็นไปได้หากคุณต้องการโดยใช้คิวธุรกรรม ในกรณีนี้คำขอถูกเขียนลงในคิวก่อนแล้วจึงทำการประมวลผลทุก ๆ n วินาที แต่แทบจะไม่จำเป็นหรือใช้งานได้จริงในกรณีของคุณ

ส่วนที่น่าสนใจคือตารางรายการสำหรับผู้ใช้ 1 ควรแสดงอย่างไร


1

คุณสามารถหลีกเลี่ยงสภาพการแข่งขันหากคุณเลื่อนการจัดสรรที่นั่งเฉพาะ

  1. รวบรวมการตั้งค่าที่นั่งจากลูกค้า (จำนวนที่นั่ง, ราคา, พื้นที่โรงละคร, ที่นั่งติดกันบังคับ ฯลฯ ... )
  2. บันทึกการกำหนดลักษณะที่นั่งที่ร้องขอในคิว
  3. คำขอที่นั่งแบบหนึ่งต่อหนึ่งถูกดึงออกมาจากคิวที่นั่งที่จัดสรรตามความต้องการและการจองเสร็จสมบูรณ์หากพบที่นั่ง
  4. หากการจองเสร็จสมบูรณ์ให้แจ้งลูกค้าและตั๋วทางไปรษณีย์ มิฉะนั้นแจ้งให้ลูกค้าทราบว่าไม่มีการจับคู่ตั๋วที่ตรงกัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.