《簡單MySQL教程六》要點:
本文介紹了簡單MySQL教程六,希望對您有用。如果有疑問,可以聯(lián)系我們。
一、數(shù)據(jù)庫鎖
1、鎖: 在數(shù)據(jù)庫中,除傳統(tǒng)的計算資源(如CPU、RAM、I/O等)的爭用以外,數(shù)據(jù)也是一種供許多用戶共享的資源.如何保證數(shù)據(jù)并發(fā)拜訪的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)拜訪性能的一個重要因素.從這個角度來說,鎖對數(shù)據(jù)庫而言顯得尤其重要,也更加復雜.
2、鎖的分類:
從對數(shù)據(jù)操作的類型(讀\寫)
讀鎖(共享鎖):針對統(tǒng)一份數(shù)據(jù),多個度操作可以同時進行而不會互相影響.
寫鎖(排它鎖):當前寫操作沒有實現(xiàn)前,它會阻斷其他寫鎖和讀鎖.
從對數(shù)據(jù)操作的粒度
表鎖
行鎖
3、表鎖(偏讀)
①、特色
偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖;鎖定粒度大,產生鎖沖突的概率最高,冰法度最低.
②、論斷
MyISAM在執(zhí)行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執(zhí)行增編削操作前,會自動給涉及的表加寫鎖.
MySQL的表級鎖有兩種模式:
表共享讀鎖(Table Read Lock)
表獨有寫鎖(Table Write Lock)
1、對MyISAM表的讀操作(加讀鎖),不會阻塞其他進程對同一表的讀哀求,但會阻塞對同一表的寫哀求.只有當讀鎖釋放后,才會執(zhí)行其它進程的寫操作.
2、對MyISAM表的寫操作(加寫鎖),會阻塞其他過程對同一表的讀和寫操作,只有當寫鎖釋放后,才會執(zhí)行其它過程的讀寫操作.
簡而言之,便是讀鎖會阻塞寫,但是不會堵塞讀.而寫鎖則會把讀和寫都堵塞.
4、行鎖
①、特色
偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,產生鎖沖突的概率最低,并發(fā)度也最高.
InnoDB與MyISAM的最大分歧有兩點:一是支持事務(TRANSACTION);二是采用了行級鎖
②、間歇鎖
當我們用范圍條件而不是相等條件檢索數(shù)據(jù),并哀求共享或排他鎖時,InnoDB會給符合條件的已有數(shù)據(jù)記錄的索引項加鎖;對于鍵值在條件范圍內但并不存在的記錄,叫做“間隙(GAP)”, InnoDB也會對這個“間隙”加鎖,這種鎖機制就是所謂的間隙鎖(Next-Key鎖).
間歇鎖的傷害:
因為Query執(zhí)行過程中通過過規(guī)模查找的話,他會鎖定整個規(guī)模內所有的索引鍵值,即使這個鍵值并不存在.
間隙鎖有一個比擬致命的弱點,就是當鎖定一個范圍鍵值之后,即使某些不存在的鍵值也會被無辜的鎖定,而造成在鎖定的時候無法插入鎖定鍵值范圍內的任何數(shù)據(jù).在某些場景下這可能會對性能造成很大的危害
③若何鎖定一行
④闡發(fā)行鎖
通過檢查InnoDB_row_lock狀態(tài)變量來闡發(fā)系統(tǒng)上行鎖的爭奪情況
show status like 'innodb_row_lock%';
對各個狀態(tài)量的闡明如下:
Innodb_row_lock_current_waits:當前正在期待鎖定的數(shù)量;
Innodb_row_lock_time:從系統(tǒng)啟動到現(xiàn)在鎖定總光陰長度;
Innodb_row_lock_time_avg:每次期待所花平均時間;
Innodb_row_lock_time_max:從系統(tǒng)啟動到現(xiàn)在期待最常的一次所花的時間;
Innodb_row_lock_waits:系統(tǒng)啟動后到現(xiàn)在總共期待的次數(shù);
對于這5個狀態(tài)變量,比擬重要的主要是
Innodb_row_lock_time_avg(期待平均時長),
Innodb_row_lock_waits(期待總次數(shù))
Innodb_row_lock_time(期待總時長)這三項.
尤其是當?shù)却螖?shù)很高,而且每次等待時長也不小的時候,我們就必要分析系統(tǒng)中為什么會有如此多的等待,然后根據(jù)分析結果著手指定優(yōu)化計劃.
優(yōu)化建議
二、數(shù)據(jù)庫事物
1、事物及其ACID
事務是由一組SQL語句組成的邏輯處置單元,事務具有以下4個屬性,通常簡稱為事務的ACID屬性.
原子性(Atomicity):事務是一個原子操作單位,其對數(shù)據(jù)的修改,要么全都執(zhí),要么全都不執(zhí)行.
一致性(Consistent):在事務開始和完成時,數(shù)據(jù)都必須堅持一致狀態(tài).這意味著所有相關的數(shù)據(jù)規(guī)則都必須應用于事務的修改,以堅持數(shù)據(jù)的完整性;事務結束時,所有的內部數(shù)據(jù)結構(如B樹索引或雙向鏈表)也都必須是正確的.
隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供必定的隔離機制,保證事務在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行.這意味著事務處理過程中的中間狀態(tài)對外部是不可見的,反之亦然.
持久性(Durable):事務完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠堅持.
2、并發(fā)事物處置帶來的問題
更新喪失
當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,由于每個事務都不知道其他事務的存在,就會產生丟失更新問題--最后的更新覆蓋了由其他事務所做的更新.
例如,兩個程序員修改同一java文件.每程序員獨立地更改其副本,然后保留更改后的副本,這樣就覆蓋了原始文檔.最后保留其更改副本的編輯人員覆蓋前一個程序員所做的更改.
如果在一個程序員完成并提交事務之前,另一個程序員不能拜訪同一文件,則可避免此問題.
臟讀
一個事務正在對一條記錄做修改,在這個事務完成并提交前,這條記錄的數(shù)據(jù)就處于紛歧致狀態(tài);這時,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“臟”數(shù)據(jù),并據(jù)此做進一步的處理,就會產生未提交的數(shù)據(jù)依賴關系.這種現(xiàn)象被形象地叫做”臟讀”.
一句話:事務A讀取到了事務B已修改但尚未提交的的數(shù)據(jù),還在這個數(shù)據(jù)基礎上做了操作.此時,如果B事務回滾,A讀取的數(shù)據(jù)無效,不相符一致性要求.
弗成重復讀
一個事務在讀取某些數(shù)據(jù)后的某個時間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)其讀出的數(shù)據(jù)已經發(fā)生了改變、或某些記錄已經被刪除了!這種現(xiàn)象就叫做“弗成重復讀”.
一句話:事務A讀取到了事務B已經提交的修改數(shù)據(jù),不相符隔離性
幻讀
一個事務按雷同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為“幻讀”.
一句話:事務A讀取到了事務B體提交的新增數(shù)據(jù),不相符隔離性.
幻讀和臟讀有點相似,
臟讀是事務B里面改動了數(shù)據(jù),
幻讀是事務B里面新增了數(shù)據(jù).
3、事物的隔離級別
臟讀”、“不可重復讀”和“幻讀”,其實都是數(shù)據(jù)庫讀一致性問題,必須由數(shù)據(jù)庫提供一定的事務隔離機制來辦理.
數(shù)據(jù)庫的事務隔離越嚴格,并發(fā)副作用越小,但付出的代價也就越大,因為事務隔離實質上就是使事務在一定程度上 “串行化”進行,這顯然與“并發(fā)”是矛盾的.同時,不同的應用對讀一致性和事務隔離程度的要求也是不同的,比如許多應用對“不可重復讀”和“幻讀”并不敏感,可能更關心數(shù)據(jù)并發(fā)拜訪的能力.
常看以后數(shù)據(jù)庫的事務隔離級別:show variables like 'tx_isolation';
《簡單MySQL教程六》是否對您有啟發(fā),歡迎查看更多與《簡單MySQL教程六》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7102.html