MySQL - 鎖

一、什么是鎖

鎖是數據庫系統區別于文件系統的一個關鍵特性。鎖機制用于管理對共享資源的并發訪問。

?


二、MySQL 不同存儲引擎支持的鎖機制

?

存儲引擎支持的鎖類型
Myisam表鎖
Innodb行鎖、表鎖
Memory表鎖
BDB頁鎖、表鎖

 
表鎖:直接鎖住的是一個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖沖突的概率更高,應對并發能力最低。(因為加鎖了,所以經常需要等待)

行鎖:直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖沖突的概率較低,應對并發能力很高。

頁鎖:鎖住的一個頁面,在 InnoDB 中一個頁面為16KB,它的開銷介于表級鎖和行級鎖中間,也可能會出現死鎖,鎖定粒度也介于表級鎖和行級鎖中間,應對并發能力介于表級鎖和行級鎖中間。

?


?三、InnoDB 存儲引擎中的鎖

InnoDB 支持的是行級鎖和表級鎖。但是 InnoDB 實際上是實現了 6 種鎖。

1、實現了兩種標準的** 行級鎖**,分別是 **共享鎖、排他鎖**。

2、實現了兩種標準的** 表級鎖**,分別是 **意向共享鎖、意向排他鎖**。

3、實現了兩種抽象的鎖,樂觀鎖、悲觀鎖。(這兩種鎖并不是真實存在的)

?

 
?四、InnoDB 存儲引擎中 各種鎖的加鎖示例

1、加共享鎖示例:

-- 事務 T1
BEGIN;
START TRANSACTION;
select * from user where id = 1 LOCK IN SHARE MODE;-- COMMIT;
-- 事務 T2-- 不加鎖的查詢 (可以查詢到)
-- SELECT * from user where id = 1;-- 不加鎖的更新 (不可以更新)
-- UPDATE `user` set age = 29 where id = 1;-- 加共享鎖的查詢 (可以查詢到)
-- SELECT * from user WHERE id = 1 LOCK IN SHARE MODE;-- 加排他鎖的查詢 (不可以查詢)
-- SELECT * from user WHERE id = 1 FOR UPDATE;

如果在事務 T1 中對行記錄加了共享鎖,那么其他事務 T2,不論加沒加鎖,都不能更新,直到事務 T1 釋放鎖。

如果在事務 T1 中對行記錄加了共享鎖,事務 T2 是沒有加鎖的查詢,或者加的是共享鎖的查詢,則可以查詢到結果。

如果在事務 T1 中對行記錄加了共享鎖,事務 T2 是加了排它鎖的查詢,則暫時不能查詢,直到事務 T1 釋放鎖。
?

 
2、加排他鎖示例

-- 事務T1
BEGIN;
START TRANSACTION;
select * from user where id = 1 FOR UPDATE;COMMIT;
-- 事務 T2-- 不加鎖的查詢 (可以查詢到)
-- SELECT * from user where id = 1;-- 不加鎖的更新 (不可以更新)
-- UPDATE `user` set age = 29 where id = 1;-- 加共享鎖的查詢 (不可以查詢到)
-- SELECT * from user WHERE id = 1 LOCK IN SHARE MODE;-- 加排他鎖的查詢 (不可以查詢到)
-- SELECT * from user WHERE id = 1 FOR UPDATE;

  如果在事務 T1 中對行記錄加了排他鎖,那么其他事務T2,如果是不加鎖的查詢,是可以查詢到結果的,但如果是加鎖的查詢或更新,則不允許操作,直到事務 T1 釋放鎖。

注:凡是更新、刪除、插入操作,Mysql都會默認給這個操作加上排他鎖,所以這里只演示查詢操作的。

 
3、加意向共享鎖

  對一個數據行加共享鎖(S),首先 InnoDB 會先找到這張表,對該表加意向共享鎖(IS)之后,再對該數據行添加共享鎖。意向共享鎖和意向排他鎖都是系統自動添加和自動釋放的,整個過程無需人工干預。

 
4、加意向排他鎖

  對一個數據行加排他鎖(X),首先 InnoDB 會先找到這張表,對該表加意向排他鎖(IX)之后,再對該數據行添加排它鎖。意向共享鎖和意向排他鎖都是系統自動添加和自動釋放的,整個過程無需人工干預。

 
5、關于樂觀鎖和悲觀鎖的說明

樂觀鎖和悲觀鎖并不是真實存在的鎖,它們只是抽象出來的,對鎖的使用情況的描述。


6、悲觀鎖 *

  悲觀鎖的特點是先獲取鎖,再進行業務操作,即“悲觀”的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的“一鎖二查三更新”即指的是使用悲觀鎖。通常來講在數據庫上的悲觀鎖需要數據庫本身提供支持,即通過常用的select … for update 操作來實現悲觀鎖。

 
7、樂觀鎖

  樂觀鎖的特點是先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新數據的最后一步再去拿一下鎖就好。樂觀鎖在數據庫上的實現完全是邏輯的,不需要數據庫提供特殊的支持。

 
?

原文鏈接:https://www.haveyb.com/article/63

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫時區那些事兒 - MySQL的時區處理

原文地址 當JVM時區和數據庫時區不一致的時候,會發生什么?這個問題也許你從來沒有注意過,但是當把Java程序容器化的時候,問題就浮現出來了,因為目前幾乎所有的Docker Image的時區都是UTC。本文探究了MySQL及其JDBC驅動…

java_函數的重載

函數的重載(Overload)概念:在同一個類中,允許存在一個以上的同名函數,只要他們的參數個數或者參數類型不同即可。函數功能一樣,僅僅是參與運算的未知內同不同時,可以定義多函數,卻使…

全新升級的AOP框架Dora.Interception[2]: 基于約定的攔截器定義方式

Dora.Interception(github地址,覺得不錯不妨給一顆星)有別于其他AOP框架的最大的一個特點就是采用針對“約定”的攔截器定義方式。如果我們為攔截器定義了一個接口或者基類,那么攔截方法將失去任意注冊依賴服務的靈活性。除此之外…

redis watch使用場景_redis不得不會的事務玩法

我們都知道redis追求的是簡單,快速,高效,在這種情況下也就拒絕了支持window平臺,學sqlserver的時候,我們知道事務還算是個比較復雜的東西,所以這吊毛要是照搬到redis中去,理所當然redis就不是那…

加快Android Studio的編譯速度

從Eclipse切換到Android Studio后,感覺Android Studio的build速度比Eclipse慢很多,以下幾個方法可以提高Android Studio的編譯速度使用Gradle 2.4Gradle 2.4對執行性能有很大的優化,但Android Studio現在默認使用的是Gradle 2.2,所以我們需要…

開發中 MySQL 規范

一、建表規范 1、數據庫名、表名、字段名必須使用小寫字母或數字,并且禁止以數字開頭 示例:goods_category、agent_operate_201812_log 2、數據庫名、表名、字段名要做到見名識意 示例:goods_category,不能 gc 3、配置表建議以 …

PaddleOCR在 Linux下的webAPI部署方案

很多小伙伴在使用OCR時都希望能采用API的方式調用,這樣就可以跨端跨平臺了。本文將介紹一種基于python的PaddleOCR識別WebAPI部署方案。喜歡的可以關注公眾號,獲取更多內容。一、 Linux環境下部署1.環境要求操作系統:CenterOS7;主…

影響程序員生涯的三個錯誤觀念,你千萬不要犯!

程序員在社會上,到底是怎樣一個生活群體?是否能找到自己方向?其實,路一直都在那里,只是你看不到而已! 當初的你,可能一直被一些技術牽著鼻子走,并不是自己在做著自己想做的&#xff…

心電圖計算心率公式_心電圖到底能反應啥問題,看過之后你也能當“醫生”

只要是經歷過健康體檢的健康人,或者做過手術的患者,基本都做過心電圖檢查。都說久病成醫,所以有些人對血、尿常規等各項檢查的結果都門清兒得很,最起碼看一眼也能說出個大概齊。偏偏心電圖這種常做的檢查,不但老病號如…

獲取正在運行的服務

手機上安裝的App,在后臺運行著很多不同功能的服務,最常見的例如消息推送相關的服務。如何查看這些服務?如何判斷某個服務是否正在運行?如何停止某一個服務呢?請看下面的方法: package com.example.servicel…

openstack的vnc啟動ssl

1、制作ssl證書# cd /etc/pki/tls/certs [rootwww certs]# make vnc.key Enter pass phrase:# 輸入密碼 Verifying - Enter pass phrase:#確認# 從private key 中刪除密碼# openssl rsa -in vnc.key -out vnc.key # make vnc.csr Country Name (2 letter code) [XX]:CN# 國家 S…

開發composer包

一、初始化&#xff08;生成composer.json文件&#xff09; composer init#輸入你要創建的composer包項目命名空間 Package name (<vendor>/<name>) [root/tiny-laravel]: #haveyb/tiny-laravel #輸入composer包的描述 Description []:#this is a tiny laravel h…

Linux本地yum源配置以及使用yum源安裝gcc編譯環境

本文檔是圖文安裝本地yum源的教程&#xff0c;以安裝gcc編譯環境為例。 適用范圍&#xff1a;所有的cetos,紅帽,fedroa版本 適用人群&#xff1a;有一點linux基礎的小白 范例系統版本&#xff1a;CentOS Linux release 7.3.1611 (Core) 范例環境&#xff1a;vmware 虛擬機 安裝…

word如何設置上標形式_如何在word中設置特殊頁碼

獲取更多業界資訊和深度好文● 點擊藍字關注我們 ●在日常工作中&#xff0c;我們編輯的word文檔經常需要設置頁碼&#xff0c;但有時文檔的第一頁是封面&#xff0c;第二頁才是正文&#xff0c;或者第二頁是目錄&#xff0c;第三頁才是正文&#xff0c;如下圖所示&#xff0c;…

[cf797c]Minimal string(貪心+模擬)

題意&#xff1a; 給出了字符串s的內容&#xff0c;字符串t&#xff0c;u初始默認為空&#xff0c;允許做兩種操作&#xff1a; 1、把s字符串第一個字符轉移到t字符串最后 2、把t字符串最后一個字符轉移到u字符串最后 最后要求s、t字符串都為空&#xff0c;問u字符串字典序最小…

發布composer包到 Packagist,并設置自動同步(從github到Packagist)

一、發布composer包 1、將我們寫好的項目包發布到github上 這一步不贅述&#xff0c;應該都會。 但是需要注意的是&#xff0c;我們一定要為我們的項目包打上tag之后再提交&#xff0c;否則 我們composer require時可能會報錯 Could not find a version of package。 # 設置…

教你在CorelDRAW中導入位圖

在CorelDRAW軟件中不能直接打開位圖圖像&#xff0c;在實際操作中&#xff0c;用戶需要使用導入位圖圖像的方法進行操作。導入位圖圖像時&#xff0c;可以導入整幅圖像&#xff0c;也可以在導入的過程中對圖像進行裁剪&#xff0c;或重新取樣圖像&#xff0c;導入整幅位圖圖像時…

.NET 6 中將 ASP.NET Core 注冊成 Windows Service

前言使用 Visual Studio 中的 Worker Service項目模板:我們很容易創建出 Windows Service&#xff1a;IHost host Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices(services >{services.AddHostedService<Worker>();}).Build();await host.R…

19.12 添加自定義監控項目 配置郵件告警 測試告警

9月12日任務19.12 添加自定義監控項目19.13/19.14 配置郵件告警19.15 測試告警19.16 不發郵件的問題處理19.12 添加自定義監控項目需求&#xff1a;監控某臺web的80端口連接數&#xff0c;并出圖兩步&#xff1a;1&#xff09;zabbix監控中心創建監控項目&#xff1b;2&#xf…

wab框架

http協議 一、http簡介 1.HTTP是一個基于TCP/IP通信協議來傳遞數據&#xff08;HTML 文件, 圖片文件, 查詢結果等&#xff09;。 2.HTTP是一個屬于應用層的面向對象的協議&#xff0c;由于其簡捷、快速的方式&#xff0c;適用于分布式超媒體信息系統。它于1990年提出&#xff0…