【mysql】只使用数据库DB如何实现--预定系统(古法)电影院座位预定
?1. 預(yù)定業(yè)務(wù)流程(以電影院座位預(yù)定)
?
2. 用悲觀(guān)鎖實(shí)現(xiàn)
我們假設(shè)有一張表記錄【放映廳】--【座位】維度的數(shù)據(jù),還有一些其他列字段如movie_session、userId、seat_status(booked or vacant)等;
case1:假設(shè)我選擇一個(gè)座位,然后進(jìn)入付款頁(yè)面。此時(shí),會(huì)話(huà)將獲得一個(gè)鎖,以便其他會(huì)話(huà)無(wú)法讀取記錄或?qū)ζ溥M(jìn)行更改。這種鎖定被稱(chēng)為“獨(dú)占鎖定”。對(duì)于試圖從表中訪(fǎng)問(wèn)鎖定記錄的任何其他用戶(hù)的會(huì)話(huà),必須等待表中特定記錄的鎖被釋放。使用‘ FOR UPDATE’和 SELECT 查詢(xún)來(lái)獲取排他鎖。
- //A single transaction to book a tickets
begin; // 事務(wù)開(kāi)始
seatsAvailable() -> Select * from booking where seat_number = ‘A1’ FOR UPDATE // 加排它鎖&當(dāng)前讀
bookTickets() -> update booking set customer_id = ‘101’ , seat_status = ‘booked’ where seat_number = ‘A1’; // 支付后更改 A1 row 數(shù)據(jù)狀態(tài)
commit; // 提交事務(wù)
注意:另一種類(lèi)型的鎖定是“共享鎖”,其中一個(gè)會(huì)話(huà)可以在該行已被其他會(huì)話(huà)獲取鎖時(shí)讀取該行。但是,在第一個(gè)會(huì)話(huà)釋放鎖之前,它不能進(jìn)行更新。使用‘ FORSHARE’和 SELECT 查詢(xún)來(lái)獲取共享鎖。共享鎖并不適用我們的分析場(chǎng)景;
case2:多用戶(hù)同時(shí)預(yù)訂多個(gè)座位。一個(gè)用戶(hù)選擇A1至A4發(fā)起預(yù)定,與此同時(shí),另一個(gè)用戶(hù)選擇的座位 A3至 A5發(fā)起預(yù)定。
- //用戶(hù)1 Transaction where user-1 books seats A1 to A4begin;seatsAvailable() -> Select * from booking where seat_number IN (‘A1’,‘A2’, A3’, ‘A4’) FOR UPDATE // 鎖定數(shù)據(jù)行范圍bookTickets() -> update booking set customer_id = ‘101’ , seat_status = ‘booked’ where seat_number IN (‘A1’,‘A2’, A3’, ‘A4’) ; // 支付commit;
- //用戶(hù)2 A single transaction where user-2 tries to book seats A3 to A5begin;seatsAvailable() -> Select * from booking where seat_number IN (‘A3’, A4’, ‘A5’) FOR UPDATE SKIP LOCKED; // 如果加SKIP LOCKED只會(huì)鎖定A5行,否則獲取鎖失敗返回bookTickets() -> update booking set customer_id = ‘102’ , seat_status = ‘booked’ where seat_number IN (‘A3’, A4’, ‘A5’) // commit;
如果用戶(hù)1優(yōu)先獲取了,A1-A4的行鎖,在用戶(hù)2則無(wú)法提交預(yù)定訂單(因?yàn)锳3,A4已經(jīng)被加了排它鎖),鎖定失敗,需要用戶(hù)2重新選擇其他座位;
3.?小結(jié)
- 以上只是為了說(shuō)明數(shù)據(jù)庫(kù)來(lái)做的話(huà)如何實(shí)現(xiàn)的;
- 現(xiàn)實(shí)場(chǎng)景中加鎖用的最多的還是分布式鎖,如redis實(shí)現(xiàn)鎖,來(lái)支持業(yè)務(wù)的高性能和擴(kuò)展性。
- 當(dāng)然也可以使用數(shù)據(jù)樂(lè)觀(guān)鎖,如版本號(hào)機(jī)制來(lái)完成加鎖的能力
總結(jié)
以上是生活随笔為你收集整理的【mysql】只使用数据库DB如何实现--预定系统(古法)电影院座位预定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库语句
- 下一篇: 激光雷达目标检测 (上)