欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > MySQL鎖機制與用法分析

MySQL鎖機制與用法分析

熱門標簽:地圖標注賺錢真假 外呼系統從哪買 陜西400電話如何申請 遵義地圖標注app 合肥營銷外呼系統收費 深圳 商家地圖標注哪個好 承德電腦地圖標注 德惠市地圖標注

本文實例講述了MySQL鎖機制與用法。分享給大家供大家參考,具體如下:

MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,MyISAM和MEMORY存儲引擎采用的是表級鎖;BDB存儲引擎采用的是頁面鎖,但也支持表級鎖;InnoDB存儲引擎既支持行級鎖,也支持表級鎖,但默認情況下采用行級鎖。

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

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

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

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

僅從鎖的角度來說,表級鎖更適合于以查詢為主,只有少量按索引條件更新數據的應用,如Web應用;而行級鎖則更適合于有大量按索引條件并發更新少量不同數據,同時又有并發查詢的應用,如一些在線事務處理系統。

一、MyISAM表鎖

1. 查詢表級鎖爭用情況

show status like 'table%';

如果table_locks_waited 的值比較高,則說明存在著比較嚴重的表級鎖爭用情況。

2. MySQL表級鎖的鎖模式

MySQL 的表級鎖有兩種模式:表共享讀鎖和表獨占寫鎖。

當一個session對某個表加了讀鎖之后,該session只能訪問加鎖的這個表,而且只能進行讀操作;其他session可以對這個表進行讀操作,但是進行寫操作會被阻塞,需要等待鎖的釋放。當一個session對某個表加了寫鎖之后,該session只能訪問加鎖的這個表,可以進行讀操作和寫操作,其他session對這個表的讀和寫操作都會被阻塞,需要等待鎖的釋放。

MyISAM 表的讀操作與寫操作之間,以及寫操作之間是串行的。

3. 如何加表鎖

加讀鎖:

lock table tbl_name read;

加寫鎖:

lock table tbl_name write;

釋放鎖:

unlock tables;

MyISAM 在執行查詢語句前,會自動給涉及的所有表加讀鎖,在執行更新操作前,會自動給涉及的表加寫鎖,這個過程并不需要用戶干預,因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。給MyISAM表顯式加鎖,一般是為了在一定程度模擬事務操作,實現對某一時間點多個表的一致性讀取。

注意,當使用LOCK TABLES時,不僅需要一次鎖定用到的所有表,而且,同一個表在SQL語句中出現多少次,就要通過與SQL語句中相同的別名鎖定多少次,否則也會出錯!

4. 并發插入

MyISAM存儲引擎有一個系統變量concurrent_insert,專門用以控制其并發插入的行為,其值分別可以為0、1或2。

(1)當concurrent_insert設置為0時,不允許并發插入。

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

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

只需在加表鎖命令中加入“local”選項,即:lock table tbl_name local read,在滿足MyISAM表并發插入條件的情況下,其他用戶就可以在表尾并發插入記錄,但更新操作會被阻塞,而且加鎖的用戶無法訪問到其他用戶并發插入的記錄。

5. MyISAM鎖調度

當寫進程和讀進程同時請求同一個MyISAM表的寫鎖和讀鎖時,寫進程會優先獲得鎖。不僅如此,即使讀請求先到鎖等待隊列,寫請求后到,寫鎖也會插到讀鎖請求之前!這是因為MySQL認為寫請求一般比讀請求更重要。這也正是MyISAM表不太適合于有大量更新操作和查詢操作應用的原因,因為大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。

通過一下一些設置調節MyISAM的調度行為:

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

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

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

(4)給系統參數max_write_lock_count設置一個合適的值,當一個表的讀鎖達到這個值后,MySQL就暫時將寫請求的優先級降低,給讀進程一定獲得鎖的機會。

二、InnoDB鎖問題

1. 查詢InnoDB行鎖爭用情況

show status like 'innodb_row_lock%';

如果InnoDB_row_lock_waitsInnoDB_row_lock_time_avg的值比較高,說明鎖爭用比較嚴重,這時可以通過設置InnoDB Monitors來進一步觀察發生鎖沖突的表、數據行等,并分析鎖爭用的原因。

打開監視器:

CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
Show innodb status\G;

停止監視器:

DROP TABLE innodb_monitor;

打開監視器以后,默認情況下每15 秒會向日志中記錄監控的內容,如果長時間打開會導致.err 文件變得非常的巨大,所以用戶在確認問題原因之后,要記得刪除監控表以關閉監視器,或者通過使用“--console”選項來啟動服務器以關閉寫日志文件。

2. InnoDB的行鎖及加鎖方法

InnoDB的行鎖有兩種:共享鎖(S)和排他鎖(X)。為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB還有兩種內部使用的意向鎖:意向共享鎖和意向排他鎖,這兩種意向鎖都是表鎖。一個事務在給數據行加鎖之前必須先取得對應表對應的意向鎖。

意向鎖是InnoDB自動加的,不需用戶干預。對于UPDATE、DELETE 和INSERT 語句,InnoDB會自動給涉及數據集加排他鎖(X);對于普通SELECT語句,InnoDB 不會加任何鎖;事務可以通過以下語句顯式給記錄集加共享鎖或排他鎖。

Set autocommit=0;

共享鎖(S):

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

排他鎖(X):

SELECT * FROM table_name WHERE ... FOR UPDATE

釋放鎖:

unlock tables;

(會隱含提交事務)

當一個事務獲得一個表的共享鎖時,其他事務可以查詢該表的記錄,也可以對該記錄加共享鎖。當一個事務對表進行更新操作時,若存在另一個事務也在該表加了共享鎖,則需要等待鎖的釋放,若另一個事務同時也對該表執行了更新操作,則會導致死鎖,另一個事務退出,當前事務完成更新操作。當一個事務獲得一個表的排他鎖時,其他事務只能對該表的記錄進行查詢,不能加共享鎖,也不能更新記錄,會出現等待。

3. InnoDB行鎖實現方式

InnoDB行鎖是通過給索引上的索引項加鎖來實現的,InnoDB 這種行鎖實現特點意味著:

(1)只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB 將使用表鎖。

(2)由于MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現鎖沖突的。

(3)當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,InnoDB 都會使用行鎖來對數據加鎖。(雖然使用的是不同的索引,但是如果記錄已經被其他session鎖定的話也是需要等待的。)

(4)即便在條件中使用了索引字段,但是否使用索引來檢索數據是由MySQL 通過判斷不同執行計劃的代價來決定的,如果MySQL 認為全表掃描效率更高,比如對一些很小的表,它就不會使用索引,這種情況下InnoDB將使用表鎖,而不是行鎖。

4. 間隙鎖

當使用范圍條件檢索數據的時候,對于鍵值在條件范圍內但并不存在的記錄,InnoDB也會進行加鎖,這個鎖就叫“間隙鎖”。InnoDB使用間隙鎖的目的,一方面是為了防止幻讀,另一方面是為了滿足恢復和復制的需要。但是這種加鎖機制會阻塞符合條件范圍內鍵值的并發插入,造成嚴重的鎖等待,所以應該盡量避免使用范圍條件來檢索數據。

除了通過范圍條件加鎖時使用間隙鎖外,如果使用相等條件請求給一個不存在的記錄加鎖,InnoDB也會使用間隙鎖!

5. 恢復和復制的需要對InnoDB鎖機制的影響

MySQL通過BINLOG記錄執行成功的INSERT、UPDATE、DELETE等更新數據的SQL語句,并由此實現MySQL數據庫的恢復和主從復制。MySQL的恢復機制(復制其實就是在Slave Mysql不斷做基于BINLOG的恢復)有以下特點:

(1)MySQL的恢復是SQL語句級的,也就是重新執行BINLOG中的SQL語句。

(2)MySQL 的Binlog是按照事務提交的先后順序記錄的,恢復也是按這個順序進行的。

所以MySQL的恢復和復制對鎖機制的要求是:在一個事務未提交前,其他并發事務不能插入滿足其鎖定條件的任何記錄,也就是不允許出現幻讀。

另外,對于一般的select語句,MySQL使用多版本數據來實現一致性,不需要加任何鎖,然而,對于“insert into target_tab select * from source_tab where ...”和“create table new_tab ...select ... From source_tab where ...”這種SQL語句,用戶并沒有對source_tab做任何更新操作,但MySQL對這種SQL語句做了特別處理,給source_tab加了共享鎖。這是因為,不加鎖的話,如果這個SQL語句執行期間,有另一個事務對source_tab做了更新并且先進行了提交,那么在BINLOG中,更新操作的位置會在該SQL語句之前,使用這個BINLOG進行數據庫恢復的話,恢復的結果就會與實際的應用邏輯不符,進行復制則會導致主從數據庫不一致。因為實際上應用插入target_tab或new_tab中的數據是另一個事務對source_tab更新前的數據,而BINLOG記錄的卻是先進行更新再執行select...insert...語句。如果上述語句的SELECT是范圍條件,InnoDB還會給源表加間隙鎖。所以這種SQL語句會阻塞對原表的并發更新,應盡量避免使用。

6. InnoDB使用表鎖的情況及注意事項

對于InnoDB表,在絕大部分情況下都應該使用行級鎖,但在個別特殊事務中,也可以考慮使用表級鎖,主要有以下兩種情況:

(1)事務需要更新大部分或全部數據,表又比較大,如果使用默認的行鎖,不僅這個事務執行效率低,而且可能造成其他事務長時間鎖等待和鎖沖突,這種情況下可以考慮使用表鎖來提高該事務的執行速度。

(2)事務涉及多個表,比較復雜,很可能引起死鎖,造成大量事務回滾。這種情況也可以考慮一次性鎖定事務涉及的表,從而避免死鎖、減少數據庫因事務回滾帶來的開銷。

另外,在InnoDB中使用表鎖需要注意以下兩點:

(1)使用LOCK TABLES雖然可以給InnoDB加表級鎖,但表鎖不是由InnoDB存儲引擎層管理的,而是由其上一層──MySQL Server負責的,僅當autocommit=0innodb_table_locks=1(默認設置)時,InnoDB層才能知道MySQL加的表鎖,MySQL Server也才能感知InnoDB加的行鎖,這種情況下,InnoDB才能自動識別涉及表級鎖的死鎖;否則,InnoDB 將無法自動檢測并處理這種死鎖。

(2)在用LOCK TABLES 對InnoDB 表加鎖時要注意,要將AUTOCOMMIT 設為0,否則MySQL不會給表加鎖;事務結束前,不要用UNLOCK TABLES釋放表鎖,因為UNLOCK TABLES會隱含地提交事務;COMMIT 或ROLLBACK 并不能釋放用LOCK TABLES加的表級鎖,必須用UNLOCK TABLES 釋放表鎖。

7. 關于死鎖

MyISAM表鎖是deadlock free的,這是因為MyISAM總是一次獲得所需的全部鎖,要么全部滿足,要么等待,因此不會出現死鎖。但在InnoDB 中,除單個SQL 組成的事務外,鎖是逐步獲得的,這就決定了在InnoDB 中發生死鎖是可能的。

發生死鎖后,InnoDB一般都能自動檢測到,并使一個事務釋放鎖并回退,另一個事務獲得鎖,繼續完成事務。但在涉及外部鎖,或涉及表鎖的情況下,InnoDB并不能完全自動檢測到死鎖,這需要通過設置鎖等待超時參數innodb_lock_wait_timeout來解決。

通常來說,死鎖都是應用設計的問題,通過調整業務流程、數據庫對象設計、事務大小,以及訪問數據庫的SQL語句,絕大部分死鎖都可以避免。下面就通過實例來介紹幾種避免死鎖的常用方法。

(1)在應用中,如果不同的程序會并發存取多個表,應盡量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會。

(2)在程序以批量方式處理數據的時候,如果事先對數據排序,保證每個線程按固定的順序來處理記錄,也可以大大降低出現死鎖的可能。

(3)在事務中,如果要更新記錄,應該直接申請足夠級別的鎖,即排他鎖,而不應先申請共享鎖,更新時再申請排他鎖,因為當用戶申請排他鎖時,其他事務可能又已經獲得了相同記錄的共享鎖,從而造成鎖沖突,甚至死鎖。

(4)在REPEATABLE-READ隔離級別下,如果兩個線程同時對相同條件記錄用SELECT...FOR UPDATE加排他鎖,在沒有符合該條件記錄情況下,兩個線程都會加鎖成功。程序發現記錄尚不存在,就試圖插入一條新記錄,如果兩個線程都這么做,就會出現死鎖。這種情況下,將隔離級別改成READ COMMITTED,就可避免問題。

(5)當隔離級別為READ COMMITTED時,如果兩個線程都先執行SELECT...FOR UPDATE,判斷是否存在符合條件的記錄,如果沒有,就插入記錄。此時,只有一個線程能插入成功,另一個線程會出現鎖等待,當第1個線程提交后,第2個線程會因主鍵重出錯,但雖然這個線程出錯了,卻會獲得一個排他鎖!這時如果有第3個線程又來申請排他鎖,也會出現死鎖。對于這種情況,可以直接做插入操作,然后再捕獲主鍵重異常,或者在遇到主鍵重錯誤時,總是執行ROLLBACK釋放獲得的排他鎖。

更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL數據庫鎖相關技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL常用函數大匯總》、《MySQL日志操作技巧大全》及《MySQL事務操作技巧匯總》

希望本文所述對大家MySQL數據庫計有所幫助。

您可能感興趣的文章:
  • MySQL查看和修改事務隔離級別的實例講解
  • Mysql事務隔離級別之讀提交詳解
  • MySQL四種事務隔離級別詳解
  • MySQL 四種事務隔離級別詳解及對比
  • 深入解析MySQL的事務隔離及其對性能產生的影響
  • MySQL中Innodb的事務隔離級別和鎖的關系的講解教程
  • MySQL數據庫事務隔離級別介紹(Transaction Isolation Level)
  • MySQL InnoDB中的鎖機制深入講解
  • 深入理解Mysql事務隔離級別與鎖機制問題

標簽:揚州 貴州 三門峽 商丘 巴中 新余 南陽 贛州

巨人網絡通訊聲明:本文標題《MySQL鎖機制與用法分析》,本文關鍵詞  MySQL,鎖,機制,與,用法,分析,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL鎖機制與用法分析》相關的同類信息!
  • 本頁收集關于MySQL鎖機制與用法分析的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美色偷偷大香| 中文字幕一区二区三区不卡| 亚洲电影一区二区| 中国老熟女重囗味hdxx| 色在线观看视频| 国产精品久久久久久久浪潮网站| 91精彩视频在线| 中文字幕欧美三区| 高清成人在线观看| 91人妻一区二区三区蜜臀| 日本一区二区综合亚洲| 国内精品伊人久久久久av一坑| 韩国三级在线一区| 亚洲久久久久久久| 欧美成人三级电影在线| 日韩高清在线不卡| a级大片在线观看| 久久先锋影音av鲁色资源网| 久草在线在线精品观看| 亚洲色图 激情小说| 欧美—级在线免费片| 国产精品456| 日本老熟俱乐部h0930| 综合亚洲深深色噜噜狠狠网站| 视频在线在亚洲| 性高潮免费视频| 欧美一区二区三区播放老司机| 国产精品成人免费| 91丨porny丨蝌蚪视频| 欧美三级乱人伦电影| 一区二区三区高清| 手机在线成人av| 精品久久人人做人人爰| 国产曰批免费观看久久久| 国产三级aaa| 自拍偷拍亚洲欧美日韩| 国产xxx在线观看| 日韩三级中文字幕| 精品一区二区综合| 日本中文字幕免费在线观看| 亚洲精品视频免费看| 亚洲色偷偷色噜噜狠狠99网| 欧美sm极限捆绑bd| 国产不卡免费视频| 欧美视频在线观看一区| 男人操女人的视频在线观看欧美| 天堂va欧美va亚洲va老司机| 337p亚洲精品色噜噜噜| 国产一区二区调教| 在线亚洲人成电影网站色www| 国产日韩精品视频一区| 成+人+亚洲+综合天堂| 欧美久久高跟鞋激| 精品一区二区影视| 91成人在线免费观看| 亚洲电影欧美电影有声小说| 男生草女生视频| 一色屋精品亚洲香蕉网站| 怡红院一区二区| 2021国产精品久久精品| zzijzzij亚洲日本少妇熟睡| 91精品国产综合久久精品app| 亚洲第四色夜色| 少妇精品无码一区二区免费视频| 日韩一级二级三级| 成人夜色视频网站在线观看| 欧美日本高清视频在线观看| 久久99久久99小草精品免视看| 日本高清www| 国产精品久久久久7777按摩| 亚洲欧美日韩偷拍| 国产精品美日韩| 中文字幕人妻一区二区三区| 国产精品丝袜久久久久久app| 粉嫩嫩av羞羞动漫久久久| 欧美一区午夜视频在线观看| 国产激情视频一区二区在线观看| 任你操精品视频| 亚洲一区二区精品视频| 国产91在线播放九色| 亚洲h在线观看| www.99re7| 精品亚洲成a人在线观看| 欧美综合一区二区| 国产福利精品导航| 欧美一级视频精品观看| 99re6这里只有精品视频在线观看| 欧美网站一区二区| 国产精品888| 日韩午夜精品视频| 91av免费观看| 中文字幕一区不卡| 亚洲欧洲久久久| 五月天激情综合网| 日本高清免费不卡视频| 韩国女主播一区| 欧美一区二区免费视频| 男插女视频网站| 亚洲欧美一区二区视频| 亚洲日本精品视频| 日韩成人精品在线| 欧美三日本三级三级在线播放| 青青草国产精品97视觉盛宴| 欧美亚洲国产bt| 99久久精品国产精品久久| 国产免费久久精品| 香蕉视频久久久| 日本女人一区二区三区| 在线播放/欧美激情| 欧美体内she精高潮| 中文字幕视频一区二区三区久| 18禁一区二区三区| 亚洲视频小说图片| 黄色录像二级片| 国产精品一二三四区| 2020国产成人综合网| 男生草女生视频| 久久99精品国产麻豆婷婷| 日韩一级在线观看| 日本黄色免费观看| 日韩综合小视频| 91精品国产综合久久精品app| 国产aⅴ综合色| 久久久精品国产免大香伊| mm131丰满少妇人体欣赏图| 欧美aaaaaa午夜精品| 欧美一级淫片007| 中国黄色a级片| 秋霞午夜av一区二区三区| 91麻豆精品国产综合久久久久久 | 日韩欧美一区二区视频| 国产乱淫av片| 性感美女极品91精品| 欧美老人xxxx18| 成年人的黄色片| 日本在线不卡一区| 91.xcao| 日韩大尺度视频| 亚洲第一主播视频| 91精品国产免费| 久久久亚洲av波多野结衣| 久久机这里只有精品| 精品国产精品网麻豆系列| www.99热| 成人天堂资源www在线| 最新中文字幕一区二区三区| 在线日韩一区二区| 黄色av电影网站| 免费成人在线视频观看| 久久品道一品道久久精品| 欧美88888| av高清久久久| 亚洲成人你懂的| 欧美mv日韩mv国产网站app| 一区二区三区伦理片| 国产91在线看| 一区二区三区中文在线观看| 欧美精品在线观看播放| 中文字幕一区二区三区人妻电影| 亚洲国产综合色| 欧美mv和日韩mv的网站| 九九这里只有精品视频| av电影天堂一区二区在线| 亚洲午夜精品网| 欧美大片顶级少妇| 很污很黄的网站| 日本亚洲一区二区三区| 青青草一区二区三区| 欧美国产日韩在线观看| 在线观看日韩电影| 玖草视频在线观看| 懂色中文一区二区在线播放| 一区二区三区四区激情| 日韩视频不卡中文| 91嫩草丨国产丨精品| 日本精品一二三| 精品亚洲成a人| 亚洲欧美另类在线| 日韩美一区二区三区| 精品人妻伦九区久久aaa片| 秘密基地免费观看完整版中文 | 色诱av手机版| 麻豆精品在线观看| 国产精品家庭影院| 欧美一区二区性放荡片| 欧美日韩色视频| 精品视频站长推荐| 国产成人综合网| 午夜欧美电影在线观看| 国产日韩欧美麻豆| 欧美精品vⅰdeose4hd| 婷婷国产成人精品视频| 白嫩情侣偷拍呻吟刺激| 国产宾馆实践打屁股91| 日本亚洲电影天堂| 亚洲天堂免费在线观看视频| 精品国产第一区二区三区观看体验| 精品无码人妻一区二区免费蜜桃 | 午夜激情综合网| 国产日韩影视精品|