我有一個表COMMANDS
,用戶同時插入數據。InnoDB表寫鎖,但允許讀取
每插入一次,我必須做一些(耗時)的計算並將結果保存到另一個表RESULTS
。
與此同時所有用戶也從COMMANDS
讀取數據。
我的問題是:
後新$command
插入,我使用所有的行該表在我的計算。每行都會影響計算,也可能會影響以前的$commands
,因爲我想鎖定此表以獲取新插入,直到進行當前計算並保存結果。但我也不想阻止其他用戶查看當前狀態COMMANDS
。
不久之後,我想鎖定表格進行寫入而不鎖定讀取。
我使用InnoDB引擎。我讀了一些關於鎖定的文檔,但我完全困惑。
共享和排它鎖,意圖鎖定,差距鎖...
看來愚蠢的,但目前我使用類似下面
public function storeNewCommand($command){
// $busy_flag is an app level global that can be read by all user sessions
if($busy_flag){
usleep(10000);
return $this->storeNewCommand($command);
}
$busy_flag = true; //(lock)
/*
...insert new $command to COMMANDS
...do calculations using all comands including last one
...store results in RESULTS
*/
$busy_flag = false; //(unlock)
}
我知道必須有更好的和聰明的解決方案的機制這沒有圈和睡覺。但我不知道使用哪一個。
注意如何設置一個隊列,這樣就可以將「用戶輸入過程」從「保存到數據庫過程」中分離出來,並控制如何在計算時避免插入新行。 – Alfabravo
謝謝@Alfabravo我正在使用一些隊列作業,但他們工作異步,並且對每個插入後的所有保存的命令的當前狀態非常重要。所以我想在數據庫級別阻塞插入,如果有一個ongoning計算。 – Jaxovee
對我來說,模仿一個表級鎖是錯誤的策略。不管用戶如何,他們都應該通過相同的隊列和相同的DAO發送他們的請求。 – Alfabravo