Mysql

選擇語句上的 MySQL 鎖定表/行

  • June 16, 2014

我有一個基於使用者輸入對欄位進行添加的網路應用程序。

例如,假設使用者 A 輸入 7,我的 Web 應用程序將首先查詢該欄位的內容以獲取目前數字,在本例中為“10”,然後向其中添加 7 並使用總數更新該欄位. 在本例中為 17。然後使用者 B 輸入 3,發生相同的常式,現在該欄位包含 20 等…

我擔心的是,如果 2 或 2000 個使用者同時查詢表並返回相同的數字,例如 10,那麼在添加和寫回新總數時會出現各種錯誤。

我應該明確鎖定SELECT語句中的表/行嗎?在這種情況下這是正常做法嗎?它會解決這個問題嗎?

這基本上是一個調查系統的匯總表,因此我可以快速執行並顯示每日總計等報告……

我認為一個簡單的更新語句就可以了:

UPDATE TableName
SET col = col + @user_input 
WHERE key_col = @key ;

更新將獲取必要的鎖(可能僅在一行上),並且任何其他更新(由其他使用者)將等待鎖被釋放或失敗。

如果您希望使用者看到更新的結果,您可以將其包含在一個事務中,如下所示:

START TRANSACTION;
   UPDATE table_name
   SET col = col + @user_input 
   WHERE key_col = @key ;

   SET @r = 
       ( SELECT col
         FROM table_name
         WHERE key_col = @key
       ) ;
COMMIT ;
SELECT @r AS col_updated ;

引用自:https://dba.stackexchange.com/questions/68304