亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

數據庫鎖

鎖和索引是數據庫兩大核心概念,了解索引,可以從 B+ 樹,Hash 索引,頁結構,緩存池,索引原則等方面理解。理解鎖,要從哪些方面入手?

為什么要加鎖

加鎖的目的,其實是為了保證數據的一致性。 當多個線程并發訪問某個數據時,加鎖,可以保證這個數據在任何時刻最多只有一個線程在訪問,保證數據的完整性和一致性。

鎖的分類

鎖可以按照鎖粒度劃分,可以按照數據庫管理角度劃分。

按照鎖粒度劃分

按照鎖粒度劃分,可以將鎖劃分成 行鎖,頁鎖和表鎖。

快速回憶一遍 InnoDB 存儲引擎的邏輯結構:所有數據都被邏輯地存放在一個空間內,稱為表空間,而表空間由段(sengment)、區(extent)、頁(page)組成。

數據庫鎖分類

 

InnoDB存儲引擎的邏輯結構

  1. 行鎖

行鎖,就是按照行的粒度對數據進行鎖定,鎖定粒度小,發生鎖沖突概率低,可以實現并發都高,但是對于鎖的開銷比較大,加上會比較慢,容易出現死鎖的情況。

  1. 頁鎖

頁鎖就是頁的粒度上進行鎖定,鎖定的數據資源比行鎖要多,因為一個頁中可以有多個行記錄,當我們使用頁鎖的時候,會出現數據浪費的現象,頁鎖的開銷介于表鎖行鎖之間。

  1. 表鎖

表鎖就是對數據進行鎖定,鎖定粒度很大,發送鎖的概率很高,數據訪問的并發度。不過好處在于對鎖的使用開銷小,加鎖會很快。

InnoDB 和 Oracle 支持行鎖和表鎖,MyISAM 只支持表鎖, MySQL BDB 存儲引擎支持頁鎖和表鎖。SQL Server 可以支持行鎖,頁鎖和表鎖。

數據庫鎖分類

 

image

按照數據庫管理角度劃分

按照數據庫管理角度劃分,可以將鎖分成排他鎖和共享鎖。

  1. 共享鎖

共享鎖,也叫讀鎖,或者 S 鎖,共享鎖鎖定的資源可以被其他用戶讀取,但不能修改。 在進行 SElECT 的時候,會將對象進行共享鎖鎖定,當數據讀取完畢之后,就會釋放共享鎖,這樣就可以保證數據在讀取時不被修改。

給某個表加共享鎖

LOCK TABLE product_comment READ;

當數據表加上共享鎖的時候,該表數據就會變成只讀模式,當時我們想更新 product_comment 表中的數據會報錯,比如:

UPDATE product_comment SET product_id = 10002 WHERE user_id = 912178;

系統報錯如下:

ERROR 1099 (HY000): Table 'product_comment' was locked with a READ lock and can't be updated

如果對表共享鎖進行解鎖:

UNLOCK TABLE;

給某行數據加共享鎖

SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

例子:

SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE
  1. 排他鎖

排他鎖也叫做獨占鎖,寫鎖或者 X 鎖,排他鎖鎖定的數據只允許進行鎖定操作的事務使用,其他事務無法對已鎖定的數據進行查詢或者修改。

給表加排他鎖

LOCK TABLE product_comment WRITE;

排他鎖的事務可以對 product_comment 進行查詢和修改。其他事務如果想要在 product_comment 表上查詢數據,則需要等待。

釋放掉排他鎖

UNLOCK TABLE;

數據行上添加排他鎖

SELECT * FROM table_name WHERE ... FOR UPDATE

例子:

SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 FOR UPDATE;

當我們對數據進行更新的時候會自動使用排他鎖,也就是 INSERT ,DELETE 或者 UPDATE 的時候,數據庫自動使用排他鎖,防止其他事務對改數據進行操作。

從程序員角度進行劃分

  1. 樂觀鎖

樂觀鎖認為對同一個數據并發操作不會總發生,是小概率事件,因此不用每次對數據進行更新或者刪除。

UPDATE ... SET version=version+1 WHERE version=version

此時,如果已經有事務對這條數據進行了更新,修改就不會成功。

數據庫鎖分類

 

  1. 悲觀鎖

悲觀鎖(Pessimistic Locking),通過數據庫自身的鎖機制來實現,從而保證數據操作的排他性。

  • 樂觀鎖適合讀操作多的場景,相對來說寫的操作?較少。它的優點在于程序實現,不存在死鎖問題,不過適?場景也會相對樂觀,因為它阻?不了除了程序以外的數據庫操作。
  • 悲觀鎖適合寫操作多的場景,因為寫的操作具有排它性。采?悲觀鎖的?式,可以在數據庫層?阻?其他事務對該數據的操作權限,防?讀-寫和寫-寫的沖突
數據庫鎖分類

 

分享到:
標簽:數據庫
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定