MySQL Lock 的搶票實作練習
在這篇" MySQL Lock : Table Lock與Row Lock ",我們在兩個連線中,用指令展示了各種類型的鎖定,但是似乎還是有點不夠白話。 因此寫了一個演唱會搶票實作練習,來看看不同的鎖定,會造成什麼結果? 先看結論,如下圖 : 三個演唱會的售票統計中,可以看到 : (1)「完全不用鎖定」的售票,會造成「超賣」的結果。 (2) 「使用 Select ... Lock in share mode 鎖定」的售票,一陣搶票中大家鎖成一團,結果票沒有賣完。 (3) 「使用 Select ... For Update 鎖定」的售票,雖然搶票,但是門票很正常的完全售完。 再來看看搶票的成功與失敗的統計,如下圖 : 在使用 Select ... Lock in share mode 中,搶到鎖定權的順利買到票,但是有人成為 Deadlock。而其他兩種情況 : 不使用鎖定與使用 Select ... for update 鎖定,搶票都沒有出現錯誤。 這個搶票實作練習,可以看到幾個很重要的結論。 (1) 不使用鎖定的搶票,容易產生「競爭條件 Race Condition」。 所謂競爭條件,不是指資料庫壞掉,也不是指 SQL 寫錯,而是多個使用者幾乎在同一…