---
# System prepended metadata

title: '[Database] 要如何設計避免超賣'
tags: [Database]

---

在網路上看到一個還未碰過但卻很實務的資料庫問題，所以先做紀錄學習

## **問題** ##
在做電商平台時多少會遇到限量搶購活動，而作為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)