簡體   English   中英

如何在mysql中處理並發訪問?

[英]How to handle concurrent access in mysql?

如果購物網站上只有1種產品可用,而2個人嘗試同時購買,那么誰會得到該產品? 服務器將如何確定用戶的優先級。“對亞馬遜上的快速銷售感到好奇”。 哪種算法?

以下是幕后可能發生的事情,使用任何現代應用程序框架都非常容易實現。

我假設您的情況是:

  • 有兩個用戶登錄到您的系統,說他們分別是U1U2
  • 選擇一個產品
  • 只提供一種產品
  • 他們都單擊了添加到購物車/立即購買/結帳
  • 將為一個用戶提供服務,並且將通知另一用戶該產品不再可用

假設T1T2是單擊結帳按鈕時的時間的納秒表示。 T1T2彼此相等的機會很小,但是有可能。

在您的情況下,Web服務器將在兩個不同的線程TH1TH2滿足用戶生成的兩個請求。 這是極不可能的,因為在任何給定時間系統中都會有數百個用戶,但假設您有多個內核,則TH1TH2由CPU的兩個不同內核提供服務並非不可能。

因此, TH1TH2都將嘗試控制您的產品。

現在,您需要為PRODUCT提供/引入兩個屬性(如MySQL列): VERSIONCHECKED_OUT

假設您將InnoDB作為數據庫引擎, TH1TH2都將同時啟動自己的事務,例如TR1TR2

TR1TR2都將:

  • 從數據庫表中讀取您的PRODUCT以及VERSIONCHECKED_OUT{id: 1, version: 0, checked_out: 0, ...}並將其傳輸到服務器。
  • 在服務器中, TR1TR2都將增加先前讀取的VERSION值,並執行一條Update語句,該語句聲明UPDATE PRODUCT SET CHECKED_OUT = 1, VERSION = 1 WHERE ID = 1 AND VERSION = 0
  • DB將鎖定行,執行UPDATE並按順序方式返回修改后的行號,因為UPDATE應該在單個線程內執行。 請注意,此線程是DB自己的線程,而不是TR1TR2
  • 在這里,如果我假設TR1 (即TH1TR2之前,即TH2由DB的UPDATE線程提供),則TR1后面的業務邏輯將獲得更新的行數等於1,而TR2的行數將變為0。
  • 這反過來意味着U1可以檢出產品,而U2會收到一條很好的道歉消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM