濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL中的悲觀鎖與樂觀鎖

MySQL中的悲觀鎖與樂觀鎖

熱門標簽:宜賓全自動外呼系統(tǒng)廠家 石家莊400電話辦理公司 新鄉(xiāng)智能外呼系統(tǒng)好處 廣東400企業(yè)電話申請流程 臨沂做地圖標注 地圖標注客戶付款 申請400電話電話價格 咸陽防封電銷卡 許昌外呼增值業(yè)務線路

在關(guān)系型數(shù)據(jù)庫中,悲觀鎖與樂觀鎖是解決資源并發(fā)場景的解決方案,接下來將詳細講解🔎一下這兩個并發(fā)解決方案的實際使用及優(yōu)缺點。

首先定義一下數(shù)據(jù)庫,做一個最簡單的庫存表,如下設(shè)計:

CREATE TABLE `order_stock` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `oid` int(50) NOT NULL COMMENT '商品ID',
 `quantity` int(20) NOT NULL COMMENT '庫存',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

quantity代表著不同商品oid的庫存,接下來OCC及PCC使用此數(shù)據(jù)庫進行演示。

樂觀鎖 OCC

它假設(shè)多用戶并發(fā)的事務在處理時不會彼此互相影響,各事務能夠在不產(chǎn)生鎖的情況下處理各自影響的那部分數(shù)據(jù)。在提交數(shù)據(jù)更新之前,每個事務會先檢查在該事務讀取數(shù)據(jù)后,有沒有其他事務又修改了該數(shù)據(jù)。如果其他事務有更新的話,正在提交的事務會進行回滾。

即“樂觀鎖🔒”認為拿鎖的用戶多半是會成功的,因此在進行完業(yè)務操作需要實際更新數(shù)據(jù)的最后一步再去拿一下鎖就好。這樣就可以避免使用數(shù)據(jù)庫自身定義的行鎖,可以避免死鎖現(xiàn)象的產(chǎn)生。

UPDATE order_stock SET quantity = quantity - 1 WHERE oid = 1 AND quantity - 1 > 0; 

樂觀并發(fā)控制多數(shù)用于數(shù)據(jù)爭用不大、沖突較少的環(huán)境中,這種環(huán)境中,偶爾回滾事務的成本會低于讀取數(shù)據(jù)時鎖定數(shù)據(jù)的成本,因此可以獲得比其他并發(fā)控制方法更高的吞吐量。

悲觀鎖 PCC

它可以阻止一個事務以影響其他用戶的方式來修改數(shù)據(jù)。如果一個事務執(zhí)行的操作讀某行數(shù)據(jù)應用了鎖,那只有當這個事務把鎖釋放,其他事務才能夠執(zhí)行與該鎖沖突的操作。

這種設(shè)計采用了“一鎖🔒二查🔍三更新”模式,就是采用數(shù)據(jù)庫中自帶 select ... for update 關(guān)鍵字進行對當前事務添加行級鎖🔒,先將要操作的數(shù)據(jù)進行鎖上,之后執(zhí)行對應查詢數(shù)據(jù)并執(zhí)行更新操作。

BEGIN
SELECT quantity FROM order_stock WHERE oid = 1 FOR UPDATE;
UPDATE order_stock SET quantity = 2 WHERE oid = 1; 
COMMIT;

MySQL還有個問題是select ... for update語句執(zhí)行中所有掃描過的行都會被鎖上,這一點很容易造成問題。因此如果在MySQL中用悲觀鎖務必要確定走了索引,而不是全表掃描。

悲觀并發(fā)控制主要用于數(shù)據(jù)爭用激烈的環(huán)境,以及發(fā)生并發(fā)沖突時使用鎖保護數(shù)據(jù)的成本要低于回滾事務的成本的環(huán)境中。

OCC 和 PCC 優(yōu)缺點

OCC 優(yōu)點及缺點

【優(yōu)點】

  • 樂觀鎖相信事務之間的數(shù)據(jù)競爭(data race)的概率是比較小的,因此盡可能直接做下去,直到提交的時候才去鎖定,所以不會產(chǎn)生任何鎖和死鎖;
  • 可以快速響應事務,隨著并發(fā)量增加,但會出現(xiàn)大量回滾出現(xiàn);
  • 效率高,但是要控制好鎖的力度。

【缺點】

  • 如果直接簡單這么做,還是有可能會遇到不可預期的結(jié)果,例如兩個事務都讀取了數(shù)據(jù)庫的某一行,經(jīng)過修改以后寫回數(shù)據(jù)庫,這時就遇到了問題;
  • 隨著并發(fā)量增加,但會出現(xiàn)大量回滾出現(xiàn)。

PCC 優(yōu)點及缺點

【優(yōu)點】

“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證;

【缺點】

  • 依賴數(shù)據(jù)庫鎖,效率低;
  • 處理加鎖的機制會讓數(shù)據(jù)庫產(chǎn)生額外的開銷,還有增加產(chǎn)生死鎖的機會;
  • 降低了并行性,一個事務如果鎖定了某行數(shù)據(jù),其他事務就必須等待該事務處理完才可以處理那行數(shù)據(jù)。

以上就是MySQL中的悲觀鎖與樂觀鎖的詳細內(nèi)容,更多關(guān)于MySQL 悲觀鎖與樂觀鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Mysql事務中Update是否會鎖表?
  • MySQL數(shù)據(jù)庫鎖機制原理解析
  • mysql查看死鎖與去除死鎖示例詳解
  • MySQL死鎖檢查處理的正常方法
  • mysql查詢表是否被鎖的方法
  • 通過實例判斷mysql update是否會鎖表
  • MySQL 行鎖和表鎖的含義及區(qū)別詳解
  • mysql 悲觀鎖與樂觀鎖的理解及應用分析
  • MySQL 8.0.19支持輸入3次錯誤密碼鎖定賬戶功能(例子)
  • MySQL 鎖的相關(guān)知識總結(jié)

標簽:鎮(zhèn)江 鷹潭 日照 合肥 北京 臺灣 阜新 貴州

巨人網(wǎng)絡通訊聲明:本文標題《MySQL中的悲觀鎖與樂觀鎖》,本文關(guān)鍵詞  MySQL,中的,悲觀,鎖,與,樂觀,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL中的悲觀鎖與樂觀鎖》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL中的悲觀鎖與樂觀鎖的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    汝阳县| 靖宇县| 浮山县| 赫章县| 合水县| 乐亭县| 军事| 柞水县| 华容县| 湖州市| 锡林浩特市| 淮南市| 隆昌县| 兰考县| 天全县| 中西区| 自治县| 长垣县| 子洲县| 日喀则市| 黔西| 沁阳市| 自贡市| 时尚| 玉环县| 崇州市| 北流市| 余江县| 马尔康县| 义马市| 夏邑县| 宿州市| 闽清县| 甘德县| 建水县| 千阳县| 屏南县| 正镶白旗| 福海县| 蓬莱市| 清镇市|