mysql myisam 鎖機制_MySQL--MyISAM之鎖機制

一、概述

MySQL有三種鎖的級別:頁級、表級、行級。

MyISAM存儲引擎采用的是表級鎖(table-level locking);

MySQL這3種鎖的特性可大致歸納如下:

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。

頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。

二、MyISAM表鎖

MyISAM存儲引擎只支持表鎖,是現在用得最多的存儲引擎。

1、查詢表級鎖爭用情況

可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:

mysql> show status like 'table%';

+———————–+———-+

| Variable_name | Value |

+———————–+———-+

| Table_locks_immediate | 76939364 | ?(表示可以立即獲取鎖的次數)

| Table_locks_waited | 305089 | ?(表示不能立即獲取鎖,需要等待鎖的次數;)

+———————–+———-+

2 rows in set (0.00 sec)

Table_locks_waited/(Table_locks_immediate+Table_locks_waited)

這個比例值越大說明表級鎖爭用的情況越嚴重。

例:比例值=0.01說明100次進程里就有一次是需要等待鎖的進程;

2、MySQL表級鎖的鎖模式

MySQL的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table WriteLock)。MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖。所以對MyISAM表進行操作,會有以下情況:

讀鎖:當某一進程對某張表進行讀操作時(select),其他線程也可以讀,但是不能寫。簡單的理解就是,我讀的時候你不能寫。

寫鎖:當某一進程對某種表某張表的寫時(insert,update,,delete),其他線程不能寫也不能讀。可以理解為,我寫的時候,你不能讀,也不能寫。

因此MyISAM的讀操作和寫操作,以及寫操作之間是串行的!MyISAM在執行讀寫操作的時候會自動給表加相應的鎖(也就是說不用顯示的使用lock table命令),MyISAM總是一次獲得SQL語句所需要的全部鎖,這也是MyISAM不會出現死鎖的原因。

3、并發插入

原則上數據表有一個讀鎖時,其它進程無法對此表進行更新操作,但在一定條件下,MyISAM表也支持查詢和插入操作的并發進行。MyISAM存儲引擎有一個系統變量concurrent_insert,專門用以控制其并發插入的行為,其值分別可以為0、1或2。

a、當concurrent_insert設置為0時,不允許并發插入。

b、當concurrent_insert設置為1時,如果MyISAM表中沒有空洞(即表的中間沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄。這也是MySQL的默認設置。

c、當concurrent_insert設置為2時,無論MyISAM表中有沒有空洞,都允許在表尾并發插入記錄。

例子:

當前進程:

1)mysql> lock table first_test read local;--加入local選項是說明,在表滿足并發插入的前提下,允許在末尾插入數據。當前進程不能進行插入和更新操作

Query OK, 0 rows affected (0.00 sec)

2)mysql> insert into first_test(age) values(15);

ERROR 1099 (HY000): Table 'first_test' was locked

with a READ lock and can't be updated

3)mysql> update first_test set age=200 where id =1;

ERROR 1099 (HY000): Table 'first_test' was locked

with a READ lock and can't be updated

其他進程:

1)mysql> insert into first_test(age) values(15);--其他進程可以進行插入、查詢和更新操作,但是更新操作要等待。。。

Query OK, 1 row affected (0.00 sec)

2)mysql> update first_test set age=200 where id =2;

等待.....

3)mysql> select * from first_test;

+----+----+

| id |age |

+----+---+

| 1 | 100|

| 2 | 11 |

| 3 | 12 |

| 4 | 13 |

| 5 | 14 |

| 6 | 14 |

+---+-- -+

6 rows in set (0.00 sec)

釋放鎖以后皆大歡喜

mysql> unlock table;

Query OK, 0 rows affected (0.00 sec)

4、MyISAM的鎖調度

在MyISAM中當一個進程請求某張表的讀鎖,而另一個進程同時也請求寫鎖,Mysql會先讓后者獲得寫鎖。即使讀請求比寫請求先到達鎖等待隊列,寫鎖也會插入到讀鎖之前。因為Mysql總是認為寫請求一般比讀請求重要,這也就是MyISAM不太適合有大量的讀寫操作的應用的原因,因為大量的寫請求會讓查詢操作很難獲取到讀鎖,有可能永遠阻塞。

可以通過一些設置來調節MyISAM的調度行為:

a、通過指定啟動參數low-priority-updates,使MyISAM引擎默認給予讀請求以優先的權利。

b、通過執行命令SET LOW_PRIORITY_UPDATES=1,使該連接發出的更新請求優先級降低。

c、通過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,降低該語句的優先級。

上面3種方法都是要么更新優先,要么查詢優先的方法。這里要說明的就是,不要盲目的給mysql設置為讀優先,因為一些需要長時間運行的查詢操作,也會使寫進程“餓死”。只有根據實際情況,來決定設置哪種操作優先。

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

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

相關文章

大廠架構師經驗分享!成功跳槽字節跳動

前言 毫不夸張地說,JVM是現代軟件工程最成功的案例之一。因為它自帶GC,又有無數可以微調的參數,且運行極其穩定可靠,所以,許多廠商的核心業務系統,才敢放心地用Java編寫,運行在JVM之上。 近幾…

java停車場管理系統程序設計代碼_社區養老服務管理系統,java程序設計

登錄界面菜單功能界面1菜單功能界面2菜單功能界面3社區養老服務管理系統設計與實現springspringMVCmybatis框架對象(javaBean,pojo)設計:服務工單javaBean創建語句如下:package project.model;import org.springframework.format.annotation.DateTimeFor…

大廠面試必問!50w字+的Java技術類校招面試題匯總

前言 剛剛過去的雙十一,讓“高性能”“高可用”“億級”這3個詞變成了技術熱點詞匯,也讓很多人再次萌發成為「架構師」的想法。先問大家一個問題:你覺得把代碼熟練、完成需求加上點勤奮,就能成為架構師么?如果你這么認…

c++客戶端發送加鎖_MySQL語句加鎖分析詳解

前言建立一個存儲三國英雄的hero表:CREATE TABLE hero ( number INT, name VARCHAR(100), country varchar(100), PRIMARY KEY (number), KEY idx_name (name)) EngineInnoDB CHARSETutf8;然后向這個表里插入幾條記錄:INSERT INTO hero V…

大廠面試必問!如何寫出高效率的SQL

前言 Spring框架自2002年誕生以來一直備受開發者青睞,它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。有人親切的稱之為:Spring 全家桶。 很多研發人員把spring看作心目中最好的java項目,沒有之一。所以這是…

accsess轉成mysql語句_輕松教你SQL轉ACCESS

SQL數據庫轉access數據庫步驟: 1. 建立access數據庫:在access中建立access數據庫和表,access字段類型與sql中字段類型的對應關系。 2. 在Access中建表是應注意它的保留關鍵字:比如Password 如果表中的某個字段使用了關鍵字&#x…

大廠首發:2021年Java工作或更難找

前言 提起MySQL,其實網上已經有一大把教程了,為什么我還要寫這篇文章呢,大概是因為網上很多網站都是比較零散,而且描述不夠直觀,不能系統對MySQL相關知識有一個系統的學習,導致不能形成知識體系。為此我撰…

linux mysql 運行狀態_Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運行狀態...

mysqladmin是MySQL一個重要的客戶端,最常見的是使用它來關閉數據庫,除此,該命令還可以了解MySQL運行狀態、進程信息、進程殺死等。本文介紹一下如何使用mysqladmin extended-status(因為沒有"歧義",所以可以使用ext代替…

大廠首發:338頁網易Java面試真題解析火爆全網

前言 為什么互聯網資訊這么發達,但是沒有出現技術人才井噴? 為什么會出現應屆生薪資倒掛多年老員工的現象? 這個世界有太多的現象都可以用**“二八定律”**來解釋。 20%拿著高工資,80%每天掙扎在增刪改查邊緣。 職場一分錢一…

mysql 導入dbm文件_DBM數據導入到mysql數據庫方法

本文章分享一篇關于DBM數據導入到mysql數據庫方法,有需要的同學可以參考一下本實例。首先說明一下,我以前使用PERL,保存文件 用DBM,有5萬多條記錄,每條記錄有15個字段。現在想用MYSQL,要吧記錄導過來。第一…

大牛手把手教你!2021Java最新大廠面試真題

引言 眾所周知,軟件系統有三高:**高并發、高性能、高可用。**三者既有區別也有聯系,門門道道很多,全面討論可以大戰三天三夜。 高并發對于Java開發者來說都不陌生,每年天貓雙十一,秒殺大促等場景阿里都穩…

高通8155車載芯片_WEY來“摩卡”云首秀,搭載高通8155芯片

本期亮點“咖啡”一詞源自埃塞俄比亞的一個名叫卡法的古鎮,在希臘語中“Kaweh”的意思是“力量與熱情“,而摩卡咖啡代表著創新和更多可能性。摩卡咖啡是由濃縮咖啡、牛奶、鮮奶油及巧克力糖漿制成的“巧克力咖啡”,相比于其他制作方法&#x…

大牛深入講解!高并發你真的理解透徹了嗎

前言 最其實不管什么時候,找工作都跑不了面試。目前很多小編都做了面試手冊了,那就是別人家的孩子都有糖了,作為一個自覺的小編,必須搞。 容我先絮叨一下,制作這個面試手冊差不多花了3個多星期時間,過程還…

太厲害了!2021年互聯網大廠Java筆經

開頭 設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。在項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應&…

fritzing導入元件_超屌的 fritzing 新建元件

標簽:fritzing 有多好,用了才知道,但是通常會遇到一個問題,他的元件庫不一定夠用,這時候就得自己做元件了,但是搜了一下網上沒有相關的教程啊。算了,去官網看英文吧。。然后官網的幫助見 http:/…

java將字節數組轉換成字符串,面試心得體會

1. 前言 大家都知道,Postman是一個非常受歡迎的API接口調試工具,提供有Chrome擴展插件版和獨立的APP,不過它的很多高級功能都需要付費才能使用。 如果你連Postman都還沒有用過,不妨可以先體驗一番。 Postman官網: h…

linux mysql 刪除表腳本_linux shell腳本自動刪除mysql表前3個月的數據

RDS有一個數據庫表tbl_online表,有6千萬數據,需要清理,保留3個月。步驟如下:創建月表將需要刪除的數據寫入月表刪除數據優化表shell如下:#!/bin/bashbase"rdsxx.mysql.rds.aliyuncs.com"#前3個月的日期months_agodate -d "-3 …

java將數組中的數據修改,深度集成!

京東Java研發崗一面(基礎面,約1小時) 自我介紹,主要講講做了什么和擅長什么 springmvc和spring-boot區別 Autowired的實現原理 Bean的默認作用范圍是什么?其他的作用范圍? 索引是什么概念有什么作用&am…

mysql oracle 表空間大小_最簡單的查詢表空間的使用量、剩余量的方法 - Focus on Oracle、MySQL and GNU/Linux...

比起用其它的視圖寫長長的一段腳本、簡便多了、據說從7.x到11g都可以用sm$ts_used & sm$ts_freeidle> select * from sm$ts_used;TABLESPACE_NAME BYTES------------------------------ ----------SYSAUX 256573440UNDOTBS1 8323072USERS 3211264SYSTEM 50678988…

java小游戲畢業論文,你不懂還不學?

1. Spring 特點 Spring 主要有如下特點: 輕量級:Spring 是非侵入式,其中的對象不依賴 Spring 的特定類;控制反轉(IoC):通過 IoC,促進了低耦合,一個對象依賴的其他對象通…