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

MySQL中的悲觀鎖與樂觀鎖

 更新時間:2020年09月11日 10:17:14   作者:debug客棧  
這篇文章主要介紹了MySQL中悲觀鎖與樂觀鎖的相關資料,幫助大家更好的理解和學習MySQL數據庫,感興趣的朋友可以了解下

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

首先定義一下數據庫,做一個最簡單的庫存表,如下設計:

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使用此數據庫進行演示。

樂觀鎖 OCC

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

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

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

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

悲觀鎖 PCC

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

這種設計采用了“一鎖🔒二查🔍三更新”模式,就是采用數據庫中自帶 select ... for update 關鍵字進行對當前事務添加行級鎖🔒,先將要操作的數據進行鎖上,之后執(zhí)行對應查詢數據并執(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ā)控制主要用于數據爭用激烈的環(huán)境,以及發(fā)生并發(fā)沖突時使用鎖保護數據的成本要低于回滾事務的成本的環(huán)境中。

OCC 和 PCC 優(yōu)缺點

OCC 優(yōu)點及缺點

【優(yōu)點】

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

【缺點】

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

PCC 優(yōu)點及缺點

【優(yōu)點】

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

【缺點】

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

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

相關文章

  • MySQL中having和where的區(qū)別及應用詳解

    MySQL中having和where的區(qū)別及應用詳解

    這篇文章主要給大家詳細介紹了MySQL中having和where的區(qū)別以及他們的使用方法,文中有相關的代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • mysql 5.6 從陌生到熟練之_數據庫備份恢復的實現方法

    mysql 5.6 從陌生到熟練之_數據庫備份恢復的實現方法

    下面小編就為大家?guī)硪黄猰ysql 5.6 從陌生到熟練之_數據庫備份恢復的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • MySQL索引的一些常見面試題大全(2022年)

    MySQL索引的一些常見面試題大全(2022年)

    索引(Index)是幫助MySQL高效獲取數據的數據結構,是對表中一列或多列值進行排序的結構,下面這篇文章主要給大家介紹了關于MySQL索引的一些常見面試題,文中介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • MySQL binlog_ignore_db 參數的具體使用

    MySQL binlog_ignore_db 參數的具體使用

    這篇文章主要介紹了MySQL binlog_ignore_db 參數的具體作用,幫助大家更好的理解和使用MySQL數據庫,感興趣的朋友可以了解下
    2020-12-12
  • 配置mysql允許遠程連接的方法

    配置mysql允許遠程連接的方法

    默認情況下,MySQL只允許本地登錄,如果要開啟遠程連接,則需要修改/etc/my.cnf文件
    2013-02-02
  • Mysql 查詢數據庫容量大小的方法步驟

    Mysql 查詢數據庫容量大小的方法步驟

    這篇文章主要介紹了Mysql 查詢數據庫容量大小的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Linux中部署MySQL環(huán)境的四種方式圖文詳解

    Linux中部署MySQL環(huán)境的四種方式圖文詳解

    這篇文章主要介紹了Linux中部署MySQL環(huán)境的四種方式,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • 詳談mysql order by in 的字符順序(推薦)

    詳談mysql order by in 的字符順序(推薦)

    下面小編就為大家?guī)硪黄斦刴ysql order by in 的字符順序(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • windows下mysql?8.0.27?安裝配置方法圖文教程

    windows下mysql?8.0.27?安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了windows下mysql?8.0.27?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL 查看庫中大表信息的幾種方法

    MySQL 查看庫中大表信息的幾種方法

    本文主要介紹了MySQL 查看庫中大表的幾種方法,為了識別可能影響數據庫性能的表,下面主要了4種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04

最新評論