Mysql
選擇語句上的 MySQL 鎖定表/行
我有一個基於使用者輸入對欄位進行添加的網路應用程序。
例如,假設使用者 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 ;