[英]How to handle concurrent access in mysql?
如果購物網站上只有1種產品可用,而2個人嘗試同時購買,那么誰會得到該產品? 服務器將如何確定用戶的優先級。“對亞馬遜上的快速銷售感到好奇”。 哪種算法?
以下是幕后可能發生的事情,使用任何現代應用程序框架都非常容易實現。
我假設您的情況是:
U1
和U2
假設T1
和T2
是單擊結帳按鈕時的時間的納秒表示。 T1
和T2
彼此相等的機會很小,但是有可能。
在您的情況下,Web服務器將在兩個不同的線程TH1
和TH2
滿足用戶生成的兩個請求。 這是極不可能的,因為在任何給定時間系統中都會有數百個用戶,但假設您有多個內核,則TH1
和TH2
由CPU的兩個不同內核提供服務並非不可能。
因此, TH1
和TH2
都將嘗試控制您的產品。
現在,您需要為PRODUCT
提供/引入兩個屬性(如MySQL列): VERSION
和CHECKED_OUT
。
假設您將InnoDB作為數據庫引擎, TH1
和TH2
都將同時啟動自己的事務,例如TR1
和TR2
。
TR1
和TR2
都將:
PRODUCT
以及VERSION
和CHECKED_OUT
: {id: 1, version: 0, checked_out: 0, ...}
並將其傳輸到服務器。 TR1
和TR2
都將增加先前讀取的VERSION
值,並執行一條Update語句,該語句聲明UPDATE PRODUCT SET CHECKED_OUT = 1, VERSION = 1 WHERE ID = 1 AND VERSION = 0
UPDATE
並按順序方式返回修改后的行號,因為UPDATE
應該在單個線程內執行。 請注意,此線程是DB自己的線程,而不是TR1
和TR2
。 TR1
(即TH1
在TR2
之前,即TH2
由DB的UPDATE
線程提供),則TR1
后面的業務邏輯將獲得更新的行數等於1,而TR2
的行數將變為0。 U1
可以檢出產品,而U2
會收到一條很好的道歉消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.