這是我從未完全掌握的東西,並且想知道我是否正確地進行了操作並對其進行了檢查。MySQL表鎖定(閱讀)
....
我有一個數據庫links
,讓我們保持它的簡單,2列
ID int(10) PK, Status enum('ready', 'in progress', 'complete'); 1 'ready' 2 'ready' 3 'ready'
....
然後,我有一個API,當查詢返回'準備好'項目的ID,這個API可以被多次同時調用,並且我想確保只給出一次該ID。
....
API的MySQL查詢..
LOCK TABLES `links` WRITE SELECT ID FROM links WHERE status = 'ready' LIMIT 1 // gets a ready one UPDATE links SET status = 'in progress' WHERE ID = 'X' // updates the one just got from line above to be in progress (so not selected by another API call UNLOCK TABLES
因此,如果兩個API調用打它拆開0.01秒,第一個應該鎖定表它正在進行更新到,解鎖後第二個得到它的機會,並做同樣的事情,但選擇一個不同的ID到第一個得到。
這是正確的嗎?或者做這種事情的最佳方式?由於它似乎會導致MySQL流量出現長時間的延遲,一些查詢等待5分鐘左右,然後MySQL命中最大連接並導致各種其他問題。
該表是InnoDB,相對較小,約165k行,狀態索引,預先感謝您的任何建議或指針。
身份證是唯一的,即與每個訪客一起創建或設置並分配給訪問者? – jeff
不,這只是一個充滿了具有唯一ID的東西的數據庫,每次調用API都應該提供一個不同的ID,沒有模糊。 – blackout2063