如何使用數據庫實現多臺服務器競爭資源的問題

簡單方法:

處理過程分爲三個步驟:數據庫

一、從數據庫查詢一條狀態爲爲用的記錄(不一樣的數據庫寫法會不同)服務器

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];

相關文章
相關標籤/搜索