在網路上看到一個還未碰過但卻很實務的資料庫問題,所以先做紀錄學習 ## **問題** ## 在做電商平台時多少會遇到限量搶購活動,而作為RD該怎麼避免因為搶購活動而導致商品超賣 ## **觀念** ## 了解悲觀鎖與樂觀鎖 **悲觀鎖**(Pessimistic Lock)~~一種物理上的鎖~~ 使用資料庫 ==Transaction== 的機制來強迫執行的順序 顧名思義,悲觀鎖會認為資料庫(table)裡的資料(data)是無時無刻在變動的,所以當對資料庫做動作的時候(SQL command)會給該筆資料上鎖。其他的SQL command就沒辦法對這筆資料做搜尋之外的動作,直到悲觀鎖被釋放 到此也可以發現悲觀鎖的缺點就是,一但做資料上鎖,那麼其他SQL command就會無法動作,如果這段Transaction執行時間較長會給使用者不良的體驗並造成系統吞吐量下降 **樂觀鎖**(Optimistic Lock)~~一種心理上的鎖~~ 相比悲觀鎖,樂觀鎖並不會對資料做鎖定,而是在表上加上==版本(version)字段==。讀的時候會抓取到這個字段,當要開始更新的時候會再次比對,如果與第一次不符就會拒絕 **使用場景** 樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,數據發生衝突的可能性就會增大,爲了保證數據的一致性,應用層需要不斷的重新獲取數據,這樣會增加大量的查詢操作,降低了系統的吞吐量 悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量 ###### 取自參考[2] ###### --- ## **參考** ## 1. [[面試][資料庫]關聯式資料庫要如何設計避免超賣?](https://ithelp.ithome.com.tw/articles/10271229) 2. [樂觀鎖與悲觀鎖各自適用場景是什麼?](https://www.readfog.com/a/1634624578764509184)