【場景】多個應用實例,不約而同地從數據庫查詢哪些任務未被執行,而後更新這些任務的狀態字段爲「正在執行」。html
(簡述,多個消費者爭領任務,同時須要宣佈哪一個任務被本身領取,而不至於讓多個消費者重複領取同一個任務)mysql
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也是能夠的。