MySQL幾種更新操作的案例分析
本文將通過一個 用戶賬戶金額更新的案例 分析幾種數(shù)據(jù)更新的操作的優(yōu)劣。希望對大家有幫助 🐶。
數(shù)據(jù)庫版本 : mysql 5.7.23
案例分析
創(chuàng)建數(shù)據(jù)庫的DDL:
CREATE TABLE `hw_account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `balance` int(11) DEFAULT NULL, `status` varchar(20) DEFAULT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
更新賬戶金額
直接更新
方案 1 查詢后更新
# 數(shù)據(jù)查詢 select * from hw_account where id = 1; # 數(shù)據(jù)更新 update hw_account set balance = 5 where id = 1;
存在的問題,就是分兩次操作,如果并發(fā)執(zhí)行的時候,可能造成更新丟失的問題.
樂觀鎖方案
利用版本號操作,即對數(shù)據(jù)庫增加樂觀鎖的方式進行。
# 數(shù)據(jù)查詢 select * from hw_account where id = 1; # 數(shù)據(jù)更新 update hw_account set balance = 5 , version = version + 1 where id = 1 and version = n; # 判斷是否成功 if row < 1 { 回滾 }
存在的問題,如果該條數(shù)據(jù)并發(fā)操作的時候,會導致其他的請求失敗。如果這個請求的前置鏈路比較長的話, 回滾成本比較高。
無鎖方案
不用查詢,采用數(shù)據(jù)庫的計算,也不需要版本號的操作,直接通過域值進行有效性判斷。具體的 SQL 如下:
# 數(shù)據(jù)更新 update hw_account set balance = balance + @change_num , version = version + 1 where id = 1 and version = n; # 判斷是否成功 if row < 1 { 回滾 }
這種方案修改比較簡單, 但是依賴于數(shù)據(jù)計算,感覺不是特別友好。
排隊操作
通過 redis 或者 zk 的分布式鎖,進行數(shù)據(jù)請求進行排隊。然后在進行數(shù)據(jù)更新。
# 偽代碼 if (獲取分布式鎖) { update hw_account set balance = @balance where id = 1; } else { # 進入等待,或者進行自旋獲取鎖 }
常見問題
如果數(shù)據(jù)中存在 update_time 字段受影響的行數(shù)是多少?
update_time 的字段定義如下,如果數(shù)據(jù)為id = 1, status = 1 如果執(zhí)行更新數(shù)據(jù)的 sql 為
update hw_account set `status` = 1 where id = 1;
返回的受影響的行數(shù)為 0;
如果執(zhí)行 update 更新但受影響的行數(shù)為 0 會加行鎖嗎?
會的, 執(zhí)行更新的語句都會加行鎖(前提,事務內)
參考資料
到此這篇關于MySQL幾種更新操作的案例分析的文章就介紹到這了,更多相關MySQL 更新操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法
這篇文章主要介紹了MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下2020-11-11MySQL Flink Watermark實現(xiàn)事件時間處理的關鍵技術
Flink Watermark是Flink流處理框架中實現(xiàn)事件時間處理的關鍵技術之一。它是通過一種機制來解決數(shù)據(jù)亂序和延遲的問題,使得Flink可以在處理遲到的數(shù)據(jù)時保證結果的準確性。Flink Watermark可以在數(shù)據(jù)流中插入一個時間戳,將數(shù)據(jù)流轉化為具有時間維度的數(shù)據(jù)集合2023-05-05