亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL的鎖機(jī)制使用詳解

 更新時(shí)間:2024年04月02日 10:45:31   作者:今吳霜.  
這篇文章主要介紹了MySQL的鎖機(jī)制使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、鎖分類

MySQL的鎖主要分為3大類

(1)、表級(jí)鎖:存儲(chǔ)引擎為Myisam。鎖住整個(gè)表,特點(diǎn)是開銷小,加鎖快,鎖定力度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。

(2)、頁級(jí)鎖:存儲(chǔ)引擎為BDB。鎖住某一頁的數(shù)據(jù)(16kb左右),特點(diǎn):開銷和枷鎖時(shí)間介于表級(jí)和行級(jí)之間;會(huì)出現(xiàn)死鎖,鎖定力度介于表鎖和行鎖之間,并發(fā)度一般。

(3)、行級(jí)鎖:存儲(chǔ)引擎為innodb。鎖住某一行的數(shù)據(jù),特點(diǎn):鎖的實(shí)現(xiàn)更加復(fù)雜,開銷大,加鎖速度慢。

根據(jù)以上特點(diǎn),僅從鎖的角度來說:

表級(jí)鎖更適合于以查詢?yōu)橹?,只有少量按索引條件更新數(shù)據(jù)的應(yīng)用,如Web應(yīng)用;

而行級(jí)鎖則更適合于有大量按索引條件并發(fā)更新少量不同數(shù)據(jù),同時(shí)又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理(OLTP)系統(tǒng)。

二、行級(jí)鎖分類

行級(jí)鎖主要分為以下7類

(1)、共享/排他鎖(shared/exclusive lock)

(2)、意向鎖(intention lock)

(3)、記錄鎖(record lock)

(4)、間隙鎖(gap lock)

(5)、臨建鎖(next-key lock)

(6)、插入意向鎖(insert intention lock)

(7)、自增鎖(auto-inc lock)

2.1 共享/排他鎖

2.1.1 共享鎖

共享鎖:又稱S鎖、讀鎖,可以允許讀,但不能寫。

共享鎖可以與共享鎖一起使用。

select ... from table_name lock in share mode;

2.1.2 排他鎖

排他鎖:又稱X鎖、寫鎖,不能允許讀,也不能允許寫,排他鎖不能與其他所一起使用。

select ... from table_name for update;

mysql中,update,delete,insert,alter 這些寫的操作默認(rèn)都會(huì)加上排他鎖。

select 默認(rèn)不會(huì)加任何鎖類型。

一旦寫數(shù)據(jù)的任務(wù)沒有完成,數(shù)據(jù)是不能被其他任務(wù)讀取的,這對(duì)并發(fā)操作有較大的影響。

共享/排他鎖的釋放方式: commit、rollback

2.2 意向鎖

innoDB 為了支持多粒度的鎖,即允許行級(jí)鎖和表級(jí)鎖共存,而引入意向鎖。

意向鎖是指未來的某個(gè)時(shí)刻,事務(wù)可能要加共享/排他鎖,先提前聲明一個(gè)意向。

這樣如果有人嘗試對(duì)全表進(jìn)行修改,就不需要判斷表中的數(shù)據(jù)是否被加鎖了,只需要通過等待意向互斥鎖被釋放就行了。

2.2.1 意向共享鎖(IS):事務(wù)想要在獲得表中某些記錄的共享鎖,需要在表上先加意向共享鎖。

2.2.2 意向互斥鎖(IX):事務(wù)想要在獲得表中某些記錄的互斥鎖,需要在表上先加意向互斥鎖。

意向鎖其實(shí)不會(huì)阻塞全表掃描之外的任何請(qǐng)求,它們的主要目的是為了表示是否有人請(qǐng)求鎖定表中的某一行數(shù)據(jù)。

2.3 記錄鎖

單個(gè)行記錄上的鎖。記錄鎖總是會(huì)鎖住索引記錄,如果innoDB存儲(chǔ)引擎表

在建立的時(shí)候沒有設(shè)置任何一個(gè)索引,那么innoDB存儲(chǔ)引擎會(huì)使用隱式的主鍵來進(jìn)行鎖定。

2.4 間隙鎖

間隙鎖鎖住記錄中的間隔,即范圍查詢的記錄。

select * from table_name where id between 1 and 10 for update;

這個(gè)腳本會(huì)鎖住1到10的數(shù)據(jù),以防止其他事務(wù)修改該區(qū)間的記錄;

間隙鎖的主要目的,就是為了防止其他事務(wù)在間隔中插入數(shù)據(jù),以導(dǎo)致“不可重復(fù)讀”。

如果把事務(wù)的隔離級(jí)別降級(jí)為讀提交(Read Committed, RC),間隙鎖則會(huì)自動(dòng)失效

查看innodb_locks_unsafe_for_binlog是否禁用:

show variables like 'innodb_locks_unsafe_for_binlog';

2.5 臨建鎖

臨建鎖是記錄鎖和間隙鎖的組合,鎖的范圍既包含記錄又包含索引區(qū)間。

默認(rèn)情況下,innoDB使用臨建鎖來鎖定記錄。

但當(dāng)查詢的索引含有唯一屬性的時(shí)候,臨建鎖會(huì)進(jìn)行優(yōu)化,將其降級(jí)為記錄鎖,即僅鎖住索引本身,不是范圍。

臨鍵鎖的主要目的,也是為了避免幻讀(Phantom Read)。

如果把事務(wù)的隔離級(jí)別降級(jí)為RC,臨鍵鎖則也會(huì)失效。

2.6 插入意向鎖

對(duì)已有數(shù)據(jù)行的修改和刪除,必須加互斥鎖,對(duì)于數(shù)據(jù)的插入,加插入意向鎖。

是專門針對(duì)于insert操作的。

2.7 自增鎖

是一種特殊的表級(jí)別的鎖,專門針對(duì)事務(wù)插入auto-increment類型的列。

最簡單的情況,如果一個(gè)事務(wù)正在往表中插入記錄,所有其他事務(wù)的插入必須等待,以便第一個(gè)事務(wù)插入的行,是連續(xù)的主鍵值。

三、其他鎖

接下看講一下其他的鎖:

3.1 死鎖

產(chǎn)生是因?yàn)榫€程鎖之間交替等待產(chǎn)生的。

值兩個(gè)或兩個(gè)以上的事務(wù)在執(zhí)行過程中,因爭奪資源而造成的一種相互等待的現(xiàn)象。

MySQL處理死鎖的方法:根據(jù)數(shù)據(jù)寫的數(shù)據(jù)量的大小來回滾小事務(wù)。

3.2 樂觀/悲觀鎖

樂觀鎖:樂觀的假定大概率不會(huì)發(fā)生并發(fā)更新沖突,訪問,處理數(shù)據(jù)的過程中不加鎖,只在更新數(shù)據(jù)時(shí)根據(jù)版本號(hào)或時(shí)間戳判斷是否有沖突,有則處理,無責(zé)提交事務(wù)。

如果系統(tǒng)并發(fā)量非常大,悲觀鎖會(huì)帶來非常大的性能問題,選擇使用樂觀鎖,現(xiàn)在大部分應(yīng)用屬于樂觀鎖

悲觀鎖:悲觀的假定大概率會(huì)發(fā)生并發(fā)更新沖突,訪問,處理數(shù)據(jù)前就加排他鎖,在整個(gè)數(shù)據(jù)處理過程中鎖定數(shù)據(jù),事務(wù)提交或回滾后才釋放鎖。

優(yōu)點(diǎn)

  • 悲觀并發(fā)控制實(shí)際上是“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證。

缺點(diǎn)

(a)在效率方面,處理加鎖的機(jī)制會(huì)讓數(shù)據(jù)庫產(chǎn)生額外的開銷,還有增加產(chǎn)生死鎖的機(jī)會(huì);

(b)在只讀型事務(wù)處理中由于不會(huì)產(chǎn)生沖突,也沒必要使用鎖,這樣做只能增加系統(tǒng)負(fù)載;還有會(huì)降低了并行性,一個(gè)事務(wù)如果鎖定了某行數(shù)據(jù),其他事務(wù)就必須等待該事務(wù)處理完才可以處理那行數(shù)

3.3 表級(jí)鎖

表級(jí)讀鎖:

lock table table_name read;

表級(jí)寫鎖:

lock table table_name write;

釋放鎖

unlock tables;

四、建議

(1)、控制事務(wù)的大?。ú僮鲗懙臄?shù)據(jù)量)

(2)、使用鎖的時(shí)候盡量要配合與攜帶索引的字段使用,避免升級(jí)為表鎖

(3)、范圍查詢,盡量減少基于范圍查詢的事務(wù)的大小

(4)、如果業(yè)務(wù)必須要使用鎖,鎖的沖突特別高的話,改為表鎖

(5)、可以根據(jù)項(xiàng)目自身的情況調(diào)節(jié)事務(wù)的innodb_flush_log_at_trx_commit

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql存儲(chǔ)過程之case語句用法實(shí)例詳解

    mysql存儲(chǔ)過程之case語句用法實(shí)例詳解

    這篇文章主要介紹了mysql存儲(chǔ)過程之case語句用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過程中case語句的相關(guān)功能、原理與使用技巧,需要的朋友可以參考下
    2019-12-12
  • Mac 將mysql路徑加入環(huán)境變量的方法

    Mac 將mysql路徑加入環(huán)境變量的方法

    這篇文章主要介紹了Mac如何將mysql路徑加入環(huán)境變量,有需要的朋友好按照下面的步驟操作即可
    2014-07-07
  • Mysql存儲(chǔ)json格式的實(shí)現(xiàn)

    Mysql存儲(chǔ)json格式的實(shí)現(xiàn)

    本文主要介紹了Mysql存儲(chǔ)json格式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    這篇文章主要介紹了用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程,可以輕松地將服務(wù)器基本信息錄入數(shù)據(jù)庫,需要的朋友可以參考下
    2015-11-11
  • mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解

    mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解

    這篇文章主要給大家介紹了關(guān)于mysql中GROUP_CONCAT函數(shù)使用技巧及問題的相關(guān)資料,GROUP_CONCAT是MySQL中的一個(gè)聚合函數(shù),它用于將多行數(shù)據(jù)按照指定的順序連接成一個(gè)字符串并返回結(jié)果,需要的朋友可以參考下
    2023-11-11
  • MySql避免重復(fù)插入記錄的幾種方法

    MySql避免重復(fù)插入記錄的幾種方法

    本文章來給大家提供三種在mysql中避免重復(fù)插入記錄方法,主要是講到了ignore,Replace,ON DUPLICATE KEY UPDATE三種方法,有需要的朋友可以參考一下
    2013-08-08
  • MySQL實(shí)現(xiàn)merge?into四種方法代碼實(shí)例

    MySQL實(shí)現(xiàn)merge?into四種方法代碼實(shí)例

    Merge?into是一個(gè)數(shù)據(jù)庫操作術(shù)語,通常用于將兩個(gè)或多個(gè)表中的數(shù)據(jù)合并到一個(gè)表中,這篇文章主要給大家介紹了關(guān)于MySQL實(shí)現(xiàn)merge?into四種方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Mysql計(jì)算n日留存率的實(shí)現(xiàn)

    Mysql計(jì)算n日留存率的實(shí)現(xiàn)

    本文主要介紹了Mysql計(jì)算n日留存率的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置示例代碼

    SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置示例代碼

    轉(zhuǎn)置即旋轉(zhuǎn)數(shù)據(jù)表的橫縱方向,常用來改變數(shù)據(jù)布局,以便用新的角度觀察,下面這篇文章主要給大家介紹了關(guān)于SQL行列轉(zhuǎn)置以及非常規(guī)行列轉(zhuǎn)置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Mysql更換MyISAM存儲(chǔ)引擎為Innodb的操作記錄總結(jié)

    Mysql更換MyISAM存儲(chǔ)引擎為Innodb的操作記錄總結(jié)

    下面小編就為大家?guī)硪黄狹ysql更換MyISAM存儲(chǔ)引擎為Innodb的操作記錄總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03

最新評(píng)論