「MySQL高級篇」MySQL鎖機制 && 事務( 二 )



「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
寫操作
  • 客戶端①直接報錯 , 因為讀鎖會排斥寫操作
  • 客戶端②陷入了阻塞狀態,得等待客戶端①釋放鎖

「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
  • unlock后,客戶端②的寫操作就能正常執行了 。

「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
總結
  • 讀鎖對于加鎖的客戶端:會限制對其他表的查詢以及對任何表的寫操作
  • 讀鎖對于其他客戶端:不會限制任何查詢 , 但會阻塞對該表的寫操作
助記自己拿到了讀鎖 , 那自己當然不能再去讀其他表 , 而又因為讀鎖不會影響到其他客戶端讀的結果,那其他客戶端自然可以任意讀 。
而對于寫操作:自己還在讀,就別想著去做寫操作了!而對于其他客戶端,如果對該表寫操作 ??隙〞绊懙疆斍翱蛻舳说淖x取結果,所以其他客戶端不能對該表進行寫操作
  • 簡而言之:自己不能三心二意【操作其他表】,而對他人則考慮自己所做的操作會不會導致兩個客戶端拿到不一致的數據,會的話就是不允許的 。
寫鎖案例客戶端 一 :
1)獲得tb_book 表的寫鎖
lock table tb_book write ;2)執行查詢操作
select * from tb_book ;3)執行更新操作
update tb_book set name = 'java編程思想(第二版)' where id = 1;更新操作執行成功 ;
客戶端二 :
4)執行查詢操作
select * from tb_book ;
  • 陷入阻塞狀態 , 因為寫鎖是排他鎖,排斥其他客戶端的寫和讀操作 。

「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
當在客戶端一中釋放鎖指令 unlock tables 后,客戶端二中的 select 語句 就會立即執行
總結
  • 寫的優先級很高,對于鎖定的表可寫可讀,但同樣不能三心二意?。?!而茰O突Ф碩雜謁ǖ謀砩兌哺剎渙?/li>
結論鎖模式的相互兼容性如表中所示:
「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
由上表可見:
1) 對MyISAM 表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞其他用戶對同一表的寫請求;
2) 對MyISAM 表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;
此外,MyISAM 的讀寫鎖調度是寫優先,這也是MyISAM不適合做寫為主的表的存儲引擎的原因 。因為寫鎖后,其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠阻塞 。
查看鎖的爭用情況show open tables;
「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
In_user : 表當前被查詢使用的次數 。如果該數為零 , 則表是打開的,但是當前沒有被使用 。
Name_locked:表名稱是否被鎖定 。名稱鎖定用于取消表或對表進行重命名等操作 。
show status like 'Table_locks%';
「MySQL高級篇」MySQL鎖機制 && 事務

文章插圖
Table_locks_immediate : 指的是能夠立即獲得表級鎖的次數 , 每立即獲取鎖,值加1 。
Table_locks_waited : 指的是不能立即獲取表級鎖而需要等待的次數,每等待一次 , 該值加1,此值高說明存在著較為嚴重的表級鎖爭用情況 。
InnoDB 行鎖行鎖介紹行鎖特點 :偏向InnoDB 存儲引擎,開銷大 , 加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高 。
InnoDB 與 MyISAM 的最大不同有兩點:一是支持事務;二是采用了行級鎖 。(兩者是息息相關的)
事務事務及其ACID屬性事務是由一組SQL語句組成的邏輯處理單元 。
事務具有以下4個特性,簡稱為事務ACID屬性 。
ACID屬性含義原子性(Atomicity)事務是一個原子操作單元 , 其對數據的修改,要么全部成功,要么全部失敗 。一致性(Consistent)在事務開始和完成時 , 數據都必須保持一致狀態 。隔離性(Isolation)數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的 “獨立” 環境下運行 。持久性(Durable)事務完成之后,對于數據的修改是永久的 。并發事務處理帶來的問題問題含義丟失更新(Lost Update)當兩個或多個事務選擇同一行 , 最初的事務修改的值,會被后提交的事務修改的值覆蓋 。臟讀(Dirty Reads)讀到了另一個事務還未提交的數據不可重復讀(Non-Repeatable Reads)一個事務執行同樣的兩次select語句,前后查詢出來的結果不一致幻讀(Phantom Reads)一個事務按照相同的查詢條件重新讀取以前查詢過的數據,卻發現其他事務插入了滿足其查詢條件的新數據 ?;米x幻讀:就像出現了“幻影”一般,原本查不到這個人,然后要插入的時候,突然又說這個人存在

推薦閱讀