亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中的樂觀鎖和悲觀鎖的區(qū)別及說明

 更新時(shí)間:2025年05月09日 10:06:51   作者:籬笆院的狗  
這篇文章主要介紹了MySQL中的樂觀鎖和悲觀鎖的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 MySQL 中,樂觀鎖悲觀鎖是兩種不同的并發(fā)控制機(jī)制,用于解決多用戶/事務(wù)同時(shí)操作數(shù)據(jù)時(shí)的沖突問題。

它們的核心理念和實(shí)現(xiàn)方式有顯著區(qū)別:

1. 悲觀鎖(Pessimistic Locking)

核心思想

假設(shè)數(shù)據(jù)會(huì)被頻繁修改,因此提前對數(shù)據(jù)進(jìn)行加鎖,防止其他事務(wù)訪問,直到當(dāng)前事務(wù)完成操作并釋放鎖。

實(shí)現(xiàn)方式

顯式加鎖:通過 SQL 語句主動(dòng)申請鎖。

  • 排他鎖(X Lock)
SELECT ... FOR UPDATE

(在事務(wù)中鎖定選中的行,阻止其他事務(wù)修改或加鎖)

  • 共享鎖(S Lock)
SELECT ... LOCK IN SHARE MODE

(允許其他事務(wù)讀,但阻止寫操作)

隱式加鎖:數(shù)據(jù)庫自動(dòng)管理(如 MySQL 的 InnoDB 引擎默認(rèn)使用行級(jí)鎖)。

適用場景

  • 寫多讀少的場景(如頻繁更新的數(shù)據(jù))。
  • 需要強(qiáng)一致性且沖突概率較高時(shí)(如金融交易)。

示例

START TRANSACTION;
-- 鎖定用戶賬戶余額(排他鎖)
SELECT balance FROM accounts WHERE user_id = 1 FOR UPDATE;
-- 執(zhí)行扣款操作
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
COMMIT;

優(yōu)點(diǎn):

  • 保證數(shù)據(jù)操作的原子性和一致性。
  • 適合高競爭場景(沖突概率高時(shí)效率更高)。

缺點(diǎn):

  • 可能導(dǎo)致死鎖(需應(yīng)用層處理)。
  • 降低并發(fā)性能(長時(shí)間持有鎖會(huì)阻塞其他操作)。

2. 樂觀鎖(Optimistic Locking)

核心思想

假設(shè)數(shù)據(jù)沖突較少發(fā)生,因此不加鎖,而是在更新時(shí)檢查數(shù)據(jù)是否被修改過。若被修改過,則拒絕操作或重試。

實(shí)現(xiàn)方式

  • 版本號(hào)(Version):在表中增加 version 字段,更新時(shí)驗(yàn)證版本號(hào)。
UPDATE table 
SET 
  column = new_value, 
  version = version + 1 
WHERE 
  id = 1 AND version = old_version;
  • 時(shí)間戳(Timestamp):類似版本號(hào),但使用時(shí)間戳標(biāo)記數(shù)據(jù)修改時(shí)間。
  • CAS(Compare-And-Swap):在應(yīng)用層比較數(shù)據(jù)一致性后再提交。

適用場景

  • 讀多寫少的場景(如商品庫存充足時(shí)的秒殺)。
  • 沖突概率較低時(shí)(如用戶點(diǎn)贊操作)。

示例

-- 初始查詢(獲取當(dāng)前版本號(hào))
SELECT balance, version FROM accounts WHERE user_id = 1;

-- 更新時(shí)檢查版本號(hào)
UPDATE accounts 
SET 
  balance = balance - 100, 
  version = version + 1 
WHERE 
  user_id = 1 AND version = 1; -- 假設(shè)舊版本號(hào)是1

-- 如果受影響行數(shù)=0,說明版本已過期,需重試或報(bào)錯(cuò)

優(yōu)點(diǎn):

  • 無鎖競爭,并發(fā)性能高。
  • 避免死鎖問題。

缺點(diǎn):

  • 沖突發(fā)生時(shí)需處理重試邏輯(如循環(huán)重試或返回錯(cuò)誤)。
  • 無法保證強(qiáng)一致性(最終一致性)。

3. 對比總結(jié)

特性悲觀鎖樂觀鎖
加鎖時(shí)機(jī)操作前加鎖操作后驗(yàn)證
實(shí)現(xiàn)復(fù)雜度依賴數(shù)據(jù)庫機(jī)制需應(yīng)用層配合(如版本號(hào))
并發(fā)性能較低(鎖競爭)較高(無鎖)
適用場景高競爭、強(qiáng)一致性低競爭、最終一致性
典型問題死鎖、性能瓶頸版本沖突、重試邏輯

4. MySQL 中的實(shí)際選擇

  • InnoDB 引擎:支持行級(jí)鎖,適合悲觀鎖(需顯式使用 FOR UPDATE)。
  • MyISAM 引擎:僅支持表級(jí)鎖,悲觀鎖性能較差,通常不推薦。
  • 樂觀鎖:需在應(yīng)用層實(shí)現(xiàn)(如通過版本號(hào)字段),與存儲(chǔ)引擎無關(guān)。

根據(jù)業(yè)務(wù)場景選擇:

  • 金融交易等強(qiáng)一致性場景 → 悲觀鎖
  • 高并發(fā)讀多寫少場景 → 樂觀鎖

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示

    MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示

    使用union操作符會(huì)將多張表中相同的數(shù)據(jù)取值一次,如果想將表1和表2中的值完整的顯示出來,可以使用union all,今天通過本文給大家分享MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示功能,需要的朋友參考下吧
    2021-08-08
  • MySQL的語法及其使用指南

    MySQL的語法及其使用指南

    數(shù)據(jù)庫的選取,創(chuàng)建,丟棄和變更 數(shù)據(jù)表和索引的創(chuàng)建,變更和丟棄從數(shù)據(jù)表檢索信息
    2008-04-04
  • mysql中的判斷函數(shù)和分支語句詳解

    mysql中的判斷函數(shù)和分支語句詳解

    本文介紹了SQL中常用的判斷函數(shù)和分支語句,判斷函數(shù)包括if()、ifnull()以及nullif(),用于處理數(shù)據(jù)判斷和空值處理,分支語句分為多條件判斷和固定值判斷,便于根據(jù)不同條件執(zhí)行相應(yīng)邏輯,這些功能在數(shù)據(jù)處理和查詢中非常實(shí)用
    2024-10-10
  • MySQL雙主(主主)架構(gòu)配置方案

    MySQL雙主(主主)架構(gòu)配置方案

    這篇文章主要介紹了MySQL雙主(主主)架構(gòu)配置方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 快速解決mysql導(dǎo)出scv文件亂碼、躥行的問題

    快速解決mysql導(dǎo)出scv文件亂碼、躥行的問題

    這篇文章主要介紹了快速解決mysql導(dǎo)出scv文件亂碼、躥行的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • MySQL 不允許從遠(yuǎn)程訪問的解決方法

    MySQL 不允許從遠(yuǎn)程訪問的解決方法

    MySQL 不允許從遠(yuǎn)程訪問的原因有很多除了下面的方法,還有需要看服務(wù)器安全設(shè)置禁止訪問本機(jī)的3306端口。
    2010-03-03
  • 如何用mysql自帶的定時(shí)器定時(shí)執(zhí)行sql(每天0點(diǎn)執(zhí)行與間隔分/時(shí)執(zhí)行)

    如何用mysql自帶的定時(shí)器定時(shí)執(zhí)行sql(每天0點(diǎn)執(zhí)行與間隔分/時(shí)執(zhí)行)

    在開發(fā)過程中經(jīng)常會(huì)遇到這樣一個(gè)問題,每天或者每月必須定時(shí)去執(zhí)行一條sql語句或更新或刪除或執(zhí)行特定的sql語句,下面這篇文章主要給大家介紹了關(guān)于如何用mysql自帶的定時(shí)器定時(shí)執(zhí)行sql(每天0點(diǎn)執(zhí)行與間隔分/時(shí)執(zhí)行)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MySQL中l(wèi)ike模糊查詢的優(yōu)化方法小結(jié)

    MySQL中l(wèi)ike模糊查詢的優(yōu)化方法小結(jié)

    本文介紹了五種優(yōu)化MySQL中l(wèi)ike模糊查詢的方法,主要包含后綴匹配走索引、反向索引、縮小搜索范圍、使用緩存和借助全文搜索引擎這幾種,感興趣的可以了解一下
    2024-11-11
  • MySQL分表和分區(qū)的具體實(shí)現(xiàn)方法

    MySQL分表和分區(qū)的具體實(shí)現(xiàn)方法

    這篇文章主要介紹了MySQL分表和分區(qū)的具體實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • mysql表分區(qū)的方式和實(shí)現(xiàn)代碼示例

    mysql表分區(qū)的方式和實(shí)現(xiàn)代碼示例

    通俗地講表分區(qū)是將一個(gè)大表,根據(jù)條件分割成若干個(gè)小表,下面這篇文章主要給大家介紹了關(guān)于mysql表分區(qū)的方式和實(shí)現(xiàn)代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論