溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL更新操作的方法有哪些

發布時間:2021-10-26 14:33:55 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

本篇內容介紹了“MySQL更新操作的方法有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

案例分析

創建數據庫的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 查詢后更新

# 數據查詢
select * from hw_account where id = 1;

# 數據更新
update hw_account set balance = 5 where id = 1;

存在的問題,就是分兩次操作,如果并發執行的時候,可能造成更新丟失的問題.

樂觀鎖方案

利用版本號操作,即對數據庫增加樂觀鎖的方式進行。

# 數據查詢
select * from hw_account where id = 1;

# 數據更新
update hw_account set balance = 5 , version = version + 1 
  where id = 1 and version = n;
  
# 判斷是否成功  
if row < 1 {
   回滾
}

存在的問題,如果該條數據并發操作的時候,會導致其他的請求失敗。如果這個請求的前置鏈路比較長的話, 回滾成本比較高。

無鎖方案

不用查詢,采用數據庫的計算,也不需要版本號的操作,直接通過域值進行有效性判斷。具體的 SQL 如下:

# 數據更新
update hw_account set balance = balance + @change_num , version = version + 1 
  where id = 1 and version = n;
  
# 判斷是否成功  
if row < 1 {
   回滾
}

這種方案修改比較簡單, 但是依賴于數據計算,感覺不是特別友好。

排隊操作

通過 redis 或者 zk 的分布式鎖,進行數據請求進行排隊。然后在進行數據更新。

# 偽代碼

if (獲取分布式鎖) {
  update hw_account set balance = @balance where id = 1;
} else {
  # 進入等待,或者進行自旋獲取鎖
}

常見問題

如果數據中存在 update_time 字段受影響的行數是多少?

update_time 的字段定義如下,如果數據為id = 1, status = 1 如果執行更新數據的 sql 為

update hw_account set `status` = 1 where id = 1;

返回的受影響的行數為 0;

如果執行 update 更新但受影響的行數為 0 會加行鎖嗎?

會的, 執行更新的語句都會加行鎖(前提,事務內)

“MySQL更新操作的方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女