欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL幾種更新操作的案例分析

 更新時間:2021年10月26日 11:33:24   作者:老鄭_  
本文將通過一個用戶賬戶金額更新的案例分析幾種數(shù)據(jù)更新的操作的優(yōu)劣,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文將通過一個 用戶賬戶金額更新的案例 分析幾種數(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.com

到此這篇關于MySQL幾種更新操作的案例分析的文章就介紹到這了,更多相關MySQL 更新操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法

    MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法

    這篇文章主要介紹了MySQL制作具有千萬條測試數(shù)據(jù)的測試庫的方法,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-11-11
  • mysql show操作簡單示例

    mysql show操作簡單示例

    這篇文章主要介紹了mysql show操作,結合簡單實例形式總結分析了mysql使用show語句顯示各種常見信息相關操作技巧,需要的朋友可以參考下
    2019-04-04
  • Windows免安裝MySQL?8.0.28?版本圖文教程

    Windows免安裝MySQL?8.0.28?版本圖文教程

    這篇文章主要為大家詳細介紹了Windows免安裝MySQL8.0.28版本圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • mysql實現(xiàn)定時備份的詳細圖文教程

    mysql實現(xiàn)定時備份的詳細圖文教程

    這篇文章主要給大家介紹了關于mysql實現(xiàn)定時備份的詳細圖文教程,我們都知道數(shù)據(jù)是無價,如果不對數(shù)據(jù)進行備份,相當是讓數(shù)據(jù)在裸跑,一旦服務器出問題,只有哭的份了,需要的朋友可以參考下
    2023-07-07
  • mysql錯誤代碼之1064的解決方案

    mysql錯誤代碼之1064的解決方案

    這篇文章主要介紹了mysql錯誤代碼之1064的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • MySQL 角色(role)功能介紹

    MySQL 角色(role)功能介紹

    這篇文章主要介紹了MySQL 角色(role)功能的相關資料,幫助大家更好的理解和學習使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • 一個簡單的MySQL備份Shell腳本

    一個簡單的MySQL備份Shell腳本

    這篇文章主要介紹了一個簡單的MySQL備份Shell腳本,本文直接給出代碼實例,需要的朋友可以參考下
    2015-07-07
  • MySQL基礎教程之事務異常情況

    MySQL基礎教程之事務異常情況

    事務(Transaction)是訪問和更新數(shù)據(jù)庫的程序執(zhí)行單元;事務中可能包含一個或多個sql語句,這些語句要么都執(zhí)行,要么都不執(zhí)行,下面這篇文章主要給大家介紹了關于MySQL基礎教程之事務異常情況的相關資料,需要的朋友可以參考下
    2022-10-10
  • MySQL Flink Watermark實現(xiàn)事件時間處理的關鍵技術

    MySQL 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
  • mysql decimal類型判斷是否為0

    mysql decimal類型判斷是否為0

    在MySQL中,DECIMAL是一種用于存儲精確小數(shù)的數(shù)據(jù)類型,本文主要介紹了mysql decimal類型判斷是否為0,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02

最新評論