最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中鎖機(jī)制的最全面講解

 更新時(shí)間:2021年09月17日 10:06:06   作者:coderymy  
大概幾個(gè)月之前項(xiàng)目中用到事務(wù),需要保證數(shù)據(jù)的強(qiáng)一致性,期間也用到了mysql的鎖,所以本文打算總結(jié)一下mysql的鎖機(jī)制,這篇文章主要給大家介紹了關(guān)于mysql中鎖機(jī)制的相關(guān)資料,需要的朋友可以參考下

前言

根據(jù)加鎖的粒度區(qū)分

  • 全局鎖
  • 表級(jí)鎖
  • 行鎖
    • 記錄鎖
    • 間隙鎖
    • 臨鍵鎖

根據(jù)加鎖的場(chǎng)景

  • 樂觀鎖
  • 悲觀鎖

全局鎖

鎖對(duì)象是:整個(gè)數(shù)據(jù)庫(kù)實(shí)例

Flush tables with read lock (FTWRL)-會(huì)讓整個(gè)庫(kù)處于只讀狀態(tài)

使用場(chǎng)景: 做全庫(kù)邏輯備份

全庫(kù)邏輯備份

為什么要進(jìn)行全局鎖才能進(jìn)行數(shù)據(jù)備份呢?

就比如售賣,我一張表記錄發(fā)貨,一張表記錄扣款.結(jié)果我在備份發(fā)貨記錄表.這個(gè)時(shí)候有人買東西了,只扣款了但是沒有發(fā)貨記錄.這個(gè)顯然是不行的

官方自帶的邏輯備份工具是mysqldump。當(dāng)mysqldump使用參數(shù)–single-transaction的時(shí)候,導(dǎo) 數(shù)據(jù)之前就會(huì)啟動(dòng)一個(gè)事務(wù),來(lái)確保拿到一致性視圖。而由于MVCC的支持,這個(gè)過(guò)程中數(shù)據(jù)是 可以正常更新的。但是這個(gè)是基于事務(wù)的基礎(chǔ)上的,針對(duì)myisam數(shù)據(jù)引擎就不可用,那么就有可能出現(xiàn)有的表不是基于innoDB的數(shù)據(jù)引擎

當(dāng)然,如果全部都是innodb的數(shù)據(jù)引擎表,那么,還是使用默認(rèn)的mysqldump增加參數(shù)–single-transaction來(lái)進(jìn)行全局邏輯備份的好

FTWRL和set global readonly=true的區(qū)別

  1. readonly會(huì)在別的邏輯中參與使用(不同系統(tǒng)不一樣)
  2. ftwrl可以在客戶端鏈接斷開時(shí),自動(dòng)釋放鎖.防止造成死鎖問(wèn)題

表級(jí)鎖

命令:lock table {tableName} read/write(write比read權(quán)限大,能write當(dāng)然能read),unlock table解鎖

鎖住的資源只允許當(dāng)前的線程可以執(zhí)行對(duì)應(yīng)的操作.且當(dāng)前線程只能對(duì)鎖住的表進(jìn)行對(duì)應(yīng)的操作

例如:lock table t1 read,則當(dāng)前線程只能讀不能寫,其他線程不能讀不能寫

MDL鎖

不需要顯式使用,在訪問(wèn)表時(shí)自動(dòng)加上(為了防止表結(jié)構(gòu)變更帶來(lái)的問(wèn)題)

在對(duì)一張表進(jìn)行增刪改查時(shí)上MDL讀鎖,在對(duì)一張表的結(jié)構(gòu)進(jìn)行變更時(shí)上MDL寫鎖

  • MDL讀鎖(共享鎖),鎖之間不互斥.所以可以允許多個(gè)線程進(jìn)行同時(shí)的增刪改查
  • MDL寫鎖(排它鎖),這個(gè)鎖和其他讀寫鎖都互斥.也就是當(dāng)前數(shù)據(jù)變更或者查詢或者結(jié)構(gòu)變更,都必須等其他的MDL寫鎖釋放后才能執(zhí)行

行鎖

行鎖是引擎層,各個(gè)引擎自己實(shí)現(xiàn)的(MyISAM不支持行鎖,所以該引擎只能一次進(jìn)行一個(gè)線程的update操作)

在事務(wù)中:行鎖會(huì)在需要使用某一行或多行數(shù)據(jù)時(shí)加上,但是所有的行鎖都會(huì)在該事務(wù)提交才會(huì)釋放也就是說(shuō),別的線程需要訪問(wèn)改行數(shù)據(jù),就需要等待線程的事務(wù)提交之后才能訪問(wèn)

舉例:

線程A執(zhí)行以下操作
begin;
update t1 set a=1 where id=1;

update t2 set b=2 where id=2;

commit

這個(gè)時(shí)候線程A分別對(duì)t1的id=1上鎖和t2的id=2上鎖.如果此時(shí)線程B訪問(wèn)t1的id=1是無(wú)法訪問(wèn)的,即使第一條語(yǔ)句已經(jīng)執(zhí)行完成了
線程B只有在線程A進(jìn)行了commit操作之后才能獲取其中的數(shù)據(jù)

所以,對(duì)于我們來(lái)說(shuō)需要注意的點(diǎn)就是:在進(jìn)行事務(wù)操作時(shí),如果update沒有順序操作,那么就盡量將訪問(wèn)最多的那條語(yǔ)句最后執(zhí)行(因?yàn)樯湘i是順序上的,但是釋放鎖是一起釋放的)

特點(diǎn) 表鎖 行鎖
加鎖層面 mysql的server層 數(shù)據(jù)引擎層
引擎 MyISAM、innoDB InnoDB
特點(diǎn) 不會(huì)死鎖、開銷小、加鎖快、鎖粒度大 易死鎖、開銷大、加鎖慢、鎖粒度小

死鎖

很多情況都回引起死鎖,大部分都是針對(duì)數(shù)據(jù)庫(kù)操作有問(wèn)題才會(huì)導(dǎo)致.比如

線程A和線程B都針對(duì)id=1和id=2進(jìn)行修改并開啟事務(wù)

線程A先修改了id=1導(dǎo)致id=1被線程A上鎖

線程B修改了id=2導(dǎo)致id=2被縣城B上鎖

此時(shí)線程A要等待id=2釋放鎖后執(zhí)行對(duì)id=2的操作
而線程B要等待id=1釋放鎖后懟id=1的操作

從而達(dá)到了一個(gè)循環(huán)死鎖的情況

處理這種問(wèn)題有兩個(gè)策略:

  1. 直接進(jìn)入等待,直到超時(shí)。這個(gè)超時(shí)時(shí)間可以通過(guò)參數(shù) innodb_lock_wait_timeout(默認(rèn)50s)來(lái)設(shè)置。這個(gè)不能設(shè)置太短,如果不是死鎖呢?
  2. 發(fā)起死鎖檢測(cè),發(fā)現(xiàn)死鎖后,主動(dòng)回滾死鎖鏈條中的某一個(gè)事務(wù),讓其他事 務(wù)得以繼續(xù)執(zhí)行。將參數(shù)innodb_deadlock_detect設(shè)置為on(默認(rèn)就是on),表示開啟這個(gè)邏輯。

記錄鎖

屬于行鎖的一種情況

針對(duì)的是事務(wù)在加鎖后鎖住的某一條記錄信息

觸發(fā)情況:查詢條件精準(zhǔn)命中且命中的條件字段是唯一的

例如:update t1 set name="張三" where id=12138

作用:記錄在被當(dāng)前事務(wù)管理時(shí),加上鎖之后不會(huì)被其他事務(wù)獲取產(chǎn)生“重復(fù)讀”和“數(shù)據(jù)臟讀”的問(wèn)題

間隙鎖

屬于行鎖的一種情況

間隙的意思就是between中的數(shù)據(jù)

在主鍵索引id中有多個(gè)數(shù)據(jù)未填充,這個(gè)時(shí)候如果兩個(gè)線程A和B,A在查詢0-10之間的數(shù)據(jù),而B在往id=3插入數(shù)據(jù),就會(huì)造成數(shù)據(jù)臟讀的問(wèn)題

所以在進(jìn)行between等范圍查找的是事務(wù)時(shí)候,會(huì)加間隙鎖進(jìn)行約束

臨鍵鎖

臨鍵鎖會(huì)把查詢出來(lái)的記錄鎖住,同時(shí)也會(huì)把該范圍查詢內(nèi)的所有間隙空間也會(huì)鎖住,再之它會(huì)把相鄰的下一個(gè)區(qū)間也會(huì)鎖住。

(臨就是相鄰的意思)

樂觀鎖和悲觀鎖

概念 樂觀鎖 悲觀鎖
概念 假定不會(huì)發(fā)生并發(fā)沖突
只在提交時(shí)判斷下是否有數(shù)據(jù)問(wèn)題
假定會(huì)發(fā)生并發(fā)沖突
從而上鎖
實(shí)現(xiàn)層面 業(yè)務(wù)代碼層面,自己實(shí)現(xiàn)
(需要結(jié)合具體業(yè)務(wù)邏輯)
mysql數(shù)據(jù)庫(kù)自身實(shí)現(xiàn)
并發(fā)情況 并發(fā)大 并發(fā)小
實(shí)現(xiàn)方式 在數(shù)據(jù)庫(kù)中增加版本號(hào)字段,
提交時(shí)判斷操作前的版本號(hào)和當(dāng)前版本號(hào)是否一致
共享鎖:select lock xxxxxx
排它鎖:select xxxx for update
其他 mysql中的synchronized其實(shí)就是排它鎖
共享鎖:運(yùn)行其他線程查不允許增刪改
排它鎖:增刪改都不允許

總結(jié)

到此這篇關(guān)于mysql中鎖機(jī)制的文章就介紹到這了,更多相關(guān)mysql鎖機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用FriendFeed來(lái)提升MySQL性能的方法

    使用FriendFeed來(lái)提升MySQL性能的方法

    這篇文章主要介紹了使用FriendFeed來(lái)提升MySQL性能的方法,用其來(lái)存儲(chǔ)無(wú)模式的數(shù)據(jù)從而能夠維護(hù)索引,需要的朋友可以參考下
    2015-06-06
  • mysql如何設(shè)置定時(shí)備份

    mysql如何設(shè)置定時(shí)備份

    這篇文章主要介紹了mysql如何設(shè)置定時(shí)備份問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 關(guān)于MySQL中explain工具的使用

    關(guān)于MySQL中explain工具的使用

    這篇文章主要介紹了關(guān)于MySQL中explain工具的使用,在select語(yǔ)句之前增加explain關(guān)鍵字,MySQL會(huì)在查詢上設(shè)置一個(gè)標(biāo)記,執(zhí)行查詢會(huì)返回執(zhí)行計(jì)劃的信息,而不是執(zhí)行這條SQL,需要的朋友可以參考下
    2023-05-05
  • Mysql?using?用法示例詳解

    Mysql?using?用法示例詳解

    這篇文章主要介紹了Mysql?using?用法示例代碼詳解,本文通過(guò)三種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • MySQL中的存儲(chǔ)過(guò)程異常處理

    MySQL中的存儲(chǔ)過(guò)程異常處理

    這篇文章主要介紹了MySQL中的存儲(chǔ)過(guò)程異常處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Mysql計(jì)算字段長(zhǎng)度函數(shù)之CHAR_LENGTH函數(shù)

    Mysql計(jì)算字段長(zhǎng)度函數(shù)之CHAR_LENGTH函數(shù)

    mysql中計(jì)算字符串長(zhǎng)度有兩個(gè)函數(shù)分別為char_length和length,char_length函數(shù)可以計(jì)算unicode字符,下面這篇文章主要給大家介紹了關(guān)于Mysql計(jì)算字段長(zhǎng)度函數(shù)之CHAR_LENGTH函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 安裝MySQL后include目錄下沒有找到libmysql.lib

    安裝MySQL后include目錄下沒有找到libmysql.lib

    安裝了MySQL后,在其安裝目錄下的include文件夾并沒有找到libmysql.lib,主要原因是在安裝MySQL的時(shí)候,沒有勾選develop component這一選項(xiàng)造成的
    2014-08-08
  • 101個(gè)MySQL的配置和優(yōu)化的提示

    101個(gè)MySQL的配置和優(yōu)化的提示

    這里是101條調(diào)節(jié)和優(yōu)化 MySQL安裝的技巧。一些技巧是針對(duì)特定的安裝環(huán)境的,但這些思路是通用的。我已經(jīng)把他們分成幾類,來(lái)幫助你掌握更多MySQL的調(diào)節(jié)和優(yōu)化技巧
    2013-08-08
  • MySQL特定表全量、增量數(shù)據(jù)同步到消息隊(duì)列-解決方案

    MySQL特定表全量、增量數(shù)據(jù)同步到消息隊(duì)列-解決方案

    mysql要同步原始全量數(shù)據(jù),也要實(shí)時(shí)同步MySQL特定庫(kù)的特定表增量數(shù)據(jù),同時(shí)對(duì)應(yīng)的修改、刪除也要對(duì)應(yīng),下面就為大家分享一下
    2021-11-11
  • mysql表操作-約束刪除、用戶填加、授權(quán)和撤權(quán)方式

    mysql表操作-約束刪除、用戶填加、授權(quán)和撤權(quán)方式

    本文詳細(xì)介紹了數(shù)據(jù)庫(kù)的約束刪除、密碼策略設(shè)置、用戶管理以及權(quán)限控制的具體操作步驟,包括查看與修改表的約束條件、設(shè)置數(shù)據(jù)庫(kù)密碼的策略、增加用戶以及用戶權(quán)限的授權(quán)與撤銷等,這些操作對(duì)于數(shù)據(jù)庫(kù)管理員來(lái)說(shuō)是基本且必須掌握的技能
    2024-09-09

最新評(píng)論

乐东| 潮安县| 五华县| 四子王旗| 两当县| 天台县| 临海市| 临高县| 清涧县| 渝中区| 吴堡县| 河池市| 城固县| 双桥区| 万年县| 赣州市| 桦甸市| 和林格尔县| 长丰县| 新竹县| 开远市| 绥宁县| 安泽县| 同心县| 东至县| 岫岩| 神农架林区| 容城县| 汶川县| 辽中县| 班戈县| 扎鲁特旗| 贞丰县| 忻州市| 宜城市| 肃宁县| 安福县| 武强县| 中牟县| 壤塘县| 花莲市|