[MYSQL]如何併發查詢並更新

【場景】多個應用實例,不約而同地從數據庫查詢哪些任務未被執行,而後更新這些任務的狀態字段爲「正在執行」。html

(簡述,多個消費者爭領任務,同時須要宣佈哪一個任務被本身領取,而不至於讓多個消費者重複領取同一個任務)mysql

 

方案一:SELECT FOR UPDATE(糟糕的方案╮(╯﹏╰)╭)

SELECT FOR UPDATE 這個語句貌似很適合併發查詢並更新的場景,由於它會自動上鎖(當使用了索引時是行鎖,不然是表鎖)。sql

但稍有不慎,很容易形成阻塞,例如這裏《MySQL行鎖深刻研究數據庫

 

 

方案二:應用層分佈式鎖

能夠在應用層使用一個分佈式鎖(能夠放在Memcache中),控制同一時間,只容許一個應用實例進行查詢並更新的操做。併發

 

方案三:利用數據庫的樂觀鎖(建議採用)

一、增長一個字段,如ver,int值,默認爲0
二、select ,同時獲取ver 值
SELECT user, ver FROM table_b WHERE  c=0
三、update時檢查ver 值是否爲第2步獲取到的值 (相似於CompareAndSet)
UPDATE table_b SET ver=4,user='xx' WHERE c=0 AND ver=3
 
若是update的記錄數爲1,則表示成功;
若是update的記錄數爲0,則表示已經被其餘應用(線程)update過了,需做異常處理
 
---------------------------------------------------
不用ver,使用表明任務狀態的字段代替ver也是能夠的。
相關文章
相關標籤/搜索