Di bioskop saya pergi ke mereka memiliki kios tiket yang memungkinkan Anda untuk memilih kursi yang Anda inginkan; mereka juga memiliki situs web yang melakukan hal yang sama (situs web juga memiliki penghitung waktu mundur seperti 30 detik di mana Anda harus memilih tempat duduk).
Sementara saya memahami hal-hal seperti transaksi basis data dan teknik lain untuk menangani beberapa pengguna secara bersamaan, saya tidak bisa memahami bagaimana banyak orang dapat memilih kursi pada saat yang sama; Apakah sesederhana orang pertama yang menekan BELI mendapatkan kursi dan orang lain akan mendapatkan pesan kesalahan, atau apakah saya melewatkan sesuatu?
concurrency
mbwasi
sumber
sumber
Jawaban:
Metode klasik untuk melakukan ini adalah dengan menggunakan basis data transaksional (jadi tidak ada bentrokan) dan untuk melakukan alokasi tentatif kursi untuk Anda yang berakhir setelah beberapa lama (misalnya, 10 menit untuk kios) yang memberi Anda cukup waktu untuk membayar. Jika transaksi (yang terlihat oleh pelanggan) jatuh atau habis, alokasi kursi dapat dilepaskan kembali ke kumpulan. (Semua perubahan status diproses melalui basis data transaksional, dan satu transaksi yang terlihat oleh pelanggan mungkin memerlukan banyak transaksi tingkat basis data.)
Maskapai akan menggunakan sistem serupa (meskipun jauh lebih kompleks karena kebutuhan untuk menangani beberapa kaki penerbangan!) Untuk memesan kursi secara online. Saya akan membayangkan bahwa batas waktu akan jauh lebih lama; tiket pesawat biasanya dipesan lebih jauh dari tiket film, dan lebih mahal juga.
sumber
30 detik yang Anda lihat saat ini sering kali lebih seperti 15 menit. Saya tidak percaya ada transaksi basis data aktif untuk durasi itu.
Jika saya merancang sistem seperti itu, ini adalah bagaimana saya akan melakukannya: Memiliki objek bisnis
Booking
danReservation
. Pemesanan pada dasarnya adalah pemesanan dikonfirmasi (yaitu dibayar). Saya akan menyimpannya dalam tabel DB yang sama dan membedakan dengan satu atau dua atribut.Saat mengambil kursi yang tersedia, Anda akan meminta pemesanan dan reservasi.
Ketika seseorang memilih tempat duduk, Anda membuat reservasi baru, dengan demikian menunjukkan tempat duduk kepada pelanggan lain. Pemesanan kedua untuk kursi yang sama akan ditolak - pembaruan atau penyisipan DB akan gagal. Jika pelanggan mengonfirmasi / membayar reservasi, Anda mengalihkannya ke pemesanan. Dalam pekerjaan batch berkala, Anda menghapus semua reservasi yang lebih dari 15 menit (atau berapa pun waktu yang Anda berikan kepada pelanggan Anda).
sumber
Ini berjalan dengan properti ACID database - Isolasi. Basis data menggunakan kunci pada data untuk menghindari modifikasi data secara bersamaan.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
sumber
Setidaknya ada 2 proses bisnis yang terlibat di sini.
Tampilkan kursi yang tersedia.
Pesan kursi yang dipilih.
Karena proses-proses ini tidak mengikuti satu sama lain secara tidak teratur, dan karena 2 orang dapat memilih kursi yang sama, masalah konkurensi muncul.
Jika desain database Anda memberikan batasan keunikan yang benar sehingga kombinasi dari:
-TheaterID
-SeatID
-EventID
unik, maka database akan mencegah duplikat.
Skenario berikut juga dimungkinkan tetapi akan diatasi dengan implementasi yang disarankan di atas:
Dengan asumsi tampilan grid tersedia untuk teater tertentu dan acara tertentu dapat ditampilkan:
Jadi semua yang perlu Anda lakukan mungkin tidak lebih dari desain database yang benar dan pilihan yang tepat pada kendala.
Pendekatan lain yang lebih kompleks mungkin dilakukan jika Anda mau, menggunakan antrian transaksi. Dalam hal ini, permintaan dituliskan terlebih dahulu ke antrian kemudian menjalankan proses setiap n detik tetapi itu hampir tidak perlu atau praktis dalam kasus Anda.
Bagian yang sangat menarik adalah apa yang harus ditampilkan oleh grid daftar untuk pengguna 1?
sumber
Anda dapat menghindari kondisi balapan jika Anda menunda mengalokasikan kursi tertentu.
sumber