以前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工做中經常使用的sql優化小知識點。面試各大互聯網公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛沖天。
鎖是計算機協調多個進程或線程併發訪問某一資源的機制。
在數據庫中,除了傳統的計算資源(如 CPU、RAM、I/O等)的爭用之外,數據也是一種須要用戶共享的資源。如何保證數據併發訪問的一致性、有效性是全部數據庫須要解決的問題,鎖衝突也是影響數據庫併發性能的一個重要因素。mysql
讀鎖:針對同一份數據,多個讀操做能夠同時進行而不會互相影響
寫鎖:當前寫操做沒有完成前,它會阻斷其餘寫鎖和讀鎖web
每次操做會鎖住整張表。
優勢:開銷小,加鎖快,不會出現死鎖
缺點:鎖的粒度大,發生鎖衝突的機率高,併發度最低面試
--手動增長表鎖 lock table 表名稱 read(write),表名稱2 read(write); --查看錶上加過的鎖 show open tables; --刪除表鎖 unlock tables;
lock table 表名 read;
當前session和其餘session均可以讀該表;
當前session中插入或者更新鎖定的表都會報錯,其餘session插入或更新則會等待。sql
lock table 表名 write;
當前session對該表的增刪改查都沒有問題,其餘session對該表的全部操做被阻塞。數據庫
MyISAM在執行查詢語句select前,會自動給涉及的全部表加讀鎖,在執行增刪該操做前,會自動給涉及的表加寫鎖。
對MyISAM表的讀操做(加讀鎖),不會阻礙其餘進程對同一表的讀請求,但會阻礙對同一表的寫請求。只有當讀鎖釋放後,纔會執行其餘操做的寫操做。
對MyISAM表的寫操做(加寫鎖),會阻塞其餘進程對同一表的讀和寫操做,只有當寫鎖釋放後,纔會執行其餘進程的讀寫操做。編程
每次總鎖住一行數據。
優勢:鎖粒度最小,發生鎖衝突機率最低,併發度最高
缺點:開銷大、加鎖慢,會出現死鎖;segmentfault
事務是由一組SQL語句組成的邏輯處理單元,事務具備如下4個屬性,一般簡稱爲事務的ACID屬性。後端
當兩個或多個事務選擇同一行,而後基於最初選定的值更新改行時,有於每一個事務都不知道其餘事務的存在,就會發生更i性能問題:最後的更新覆蓋了由其餘事務所作的更新。session
一個事務正在對一條記錄作修改,在這個事務完成並提交前,這條記錄的數據就處於不一致的狀態;這時,另外一個事務也來讀取同一條記錄,若是不加控制,第二個事務讀取了這些「髒」數據,並據此進一步的處理,就會產生未提交的數據依賴關係。這種現象被稱爲「髒讀」。
事務A讀取到事務B已經修改但未提交的數據,還在這個數據基礎上作了修改。此時,若是事務B回滾了,事務A的數據無效,不符合一致性要求。數據結構
一個事務在讀取某些數據後的某個時間,再次讀取之前讀過的數據,卻發現起讀出的數據已經發生了改變、或某些記錄已經被刪除。這種現象叫作「不可重讀」。
事務A讀取到了事務B已經提交的修改數據,不符合隔離性。
一個事務按照相同的查詢條件讀取之前檢索過的數據,卻發現某些事務插入了知足其查詢條件的新數據,這種現象稱爲「幻讀」。
事務A讀取了事務B提交的新增數據,不符合隔離性。
髒讀、不可重讀和幻讀,其實都是數據庫讀一致性的問題,必須由數據庫提供必定的事務隔離機制來解決。
數據庫的事務隔離級別越嚴格,併發反作用越小,但付出的代價也越大,由於事務隔離實質上就是事務在必定程度上「串行化」進行,這顯然與「併發」是矛盾的。
同時,不一樣的應用對讀一致性和事務隔離程度的要求也是不一樣的,許多應用對「不可重讀」和「幻讀」並不敏感,可能更關心數據的併發訪問的能力。
還沒關注個人公衆號?