處理過程分爲三個步驟:數據庫
一、從數據庫查詢一條狀態爲爲用的記錄(不一樣的數據庫寫法會不同)服務器
select * from table1 where state = '未用' limit 1ui
二、將數據狀態更新爲已用,若是更新成功(影響記錄數爲1表示成功)則表示獲取數據成功,不然這條數據已經被其餘服務器或線程所搶用。線程
update table1 set state = '已用' where id='數據id' state = '未用';it
三、使用數據,若是未正常使用數據可將數據狀態還原爲未用table
上面這個方法存在一個缺陷,假如獲取數據後本服務器掛掉,會致使數據未正常處理,能夠考慮另一個方法處理:增長一個用於記錄數據獲取的表table2(table1_id(主鍵),guid(用於惟一標識獲取數據放),expired(過時時間))gui
一、從數據庫查詢一條狀態爲爲用的記錄,不一樣的數據庫寫法會不同date
delete from table2 where expired <= '當前時間';(先刪除過時的記錄,可能獲取方已掛掉)select
select * from table1 where state = '未用' and not exists(select * from table2 where table1_id = table1.id) limit 1;方法
二、在table2插入一條數據表名本方已獲取數據,若是插入成功(影響記錄數爲1,沒有拋出主鍵衝突的異常)則表示獲取數據成功,不然這條數據已經被其餘服務器或線程所搶用。
insert into table2 (...) values (記錄的id,本方的惟一標識,當前時間+一個合理的值做爲過時時間);
三、使用數據,若是正常使用數據則將數據狀態更新爲已用,並刪除table2的記錄
update table1 set state = '已用' where id='數據id' state = '未用';
delete from table2 where id=[id];