MySQL幾種更新操作的案例分析
本文將通過(guò)一個(gè) 用戶賬戶金額更新的案例 分析幾種數(shù)據(jù)更新的操作的優(yōu)劣。希望對(duì)大家有幫助 🐶。
數(shù)據(jù)庫(kù)版本 : mysql 5.7.23
案例分析
創(chuàng)建數(shù)據(jù)庫(kù)的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;
存在的問(wèn)題,就是分兩次操作,如果并發(fā)執(zhí)行的時(shí)候,可能造成更新丟失的問(wèn)題.
樂(lè)觀鎖方案
利用版本號(hào)操作,即對(duì)數(shù)據(jù)庫(kù)增加樂(lè)觀鎖的方式進(jìn)行。
# 數(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 {
回滾
}
存在的問(wèn)題,如果該條數(shù)據(jù)并發(fā)操作的時(shí)候,會(huì)導(dǎo)致其他的請(qǐng)求失敗。如果這個(gè)請(qǐng)求的前置鏈路比較長(zhǎng)的話, 回滾成本比較高。
無(wú)鎖方案
不用查詢,采用數(shù)據(jù)庫(kù)的計(jì)算,也不需要版本號(hào)的操作,直接通過(guò)域值進(jìn)行有效性判斷。具體的 SQL 如下:
# 數(shù)據(jù)更新
update hw_account set balance = balance + @change_num , version = version + 1
where id = 1 and version = n;
# 判斷是否成功
if row < 1 {
回滾
}
這種方案修改比較簡(jiǎn)單, 但是依賴于數(shù)據(jù)計(jì)算,感覺(jué)不是特別友好。
排隊(duì)操作
通過(guò) redis 或者 zk 的分布式鎖,進(jìn)行數(shù)據(jù)請(qǐng)求進(jìn)行排隊(duì)。然后在進(jìn)行數(shù)據(jù)更新。
# 偽代碼
if (獲取分布式鎖) {
update hw_account set balance = @balance where id = 1;
} else {
# 進(jìn)入等待,或者進(jìn)行自旋獲取鎖
}
常見問(wèn)題
如果數(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 會(huì)加行鎖嗎?
會(huì)的, 執(zhí)行更新的語(yǔ)句都會(huì)加行鎖(前提,事務(wù)內(nèi))
參考資料
到此這篇關(guān)于MySQL幾種更新操作的案例分析的文章就介紹到這了,更多相關(guān)MySQL 更新操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL索引失效十種場(chǎng)景與優(yōu)化方案
這篇文章主要介紹了MySQL索引失效十種場(chǎng)景與優(yōu)化方案,文中有詳細(xì)的代碼示例供參考閱讀,感興趣的朋友可以看一下2023-05-05
mysql把查詢結(jié)果按逗號(hào)分割的實(shí)現(xiàn)示例
使用MySQL數(shù)據(jù)庫(kù)的GROUP_CONCAT函數(shù),可以將查詢結(jié)果按逗號(hào)或其他指定分隔符連接成字符串,這種方法適用于需要匯總數(shù)據(jù)并以字符串形式展示的場(chǎng)景,本文介紹了GROUP_CONCAT函數(shù)的基本用法和注意事項(xiàng),感興趣的可以了解一下2024-09-09
教你如何在Mac上安裝mysql數(shù)據(jù)庫(kù)
本文給大家詳細(xì)介紹了如何在Mac上安裝mysql數(shù)據(jù)庫(kù)的方法,非常的細(xì)致,有需要的小伙伴可以參考下2018-05-05
實(shí)現(xiàn)數(shù)據(jù)庫(kù)水平切分的兩個(gè)思路
今天小編就為大家分享一篇關(guān)于實(shí)現(xiàn)數(shù)據(jù)庫(kù)水平切分的兩個(gè)思路,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Mysql時(shí)間軸數(shù)據(jù) 獲取同一天數(shù)據(jù)的前三條
這篇文章主要介紹了Mysql時(shí)間軸數(shù)據(jù) 獲取同一天數(shù)據(jù)的前三條 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
mysq啟動(dòng)失敗問(wèn)題及場(chǎng)景分析
這篇文章主要介紹了mysq啟動(dòng)失敗問(wèn)題及解決方法,通過(guò)問(wèn)題分析定位特殊場(chǎng)景解析給大家?guī)?lái)完美解決方案,需要的朋友可以參考下2021-07-07

