日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

表锁与行锁的区别以及适用情况

發布時間:2025/3/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 表锁与行锁的区别以及适用情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是鎖?

  • 鎖是計算機協調多個進程或線程并發訪問某一資源的機制;
  • 在數據庫中,除傳統的計算資源(如CPU、RAM、I/O、等)的爭用外,數據也是一種供許多用戶共享的資源;
  • 如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素;
  • 鎖對數據庫極其重要,也更復雜。

表鎖(偏讀)

  • 偏向MYISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖沖突的概率最高,并發度最低;
  • 手動增加表鎖:
lock table 表名 read(write);
  • 查看表上加過的鎖:
show open tables;
  • 釋放表鎖:
unlock tables; tips: MYISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行增刪改操作前,會自動給涉及的表加寫鎖。 讀鎖會阻塞寫,不阻塞讀;寫鎖會阻塞讀+寫。

可通過檢查table_locks_waited和table_locks_immediate狀態變量分析系統上的表鎖定;

table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,每等待一次鎖值加1),值越高表明存在著嚴重的表級鎖爭用情況; table_locks_immediate:產生表級鎖定的次數,表示可以立即獲取鎖的查詢次數,每立即獲取鎖值加1.

tips:MYISAM的讀寫鎖調度是寫優先,不適合做寫為主表的引擎;寫鎖后。其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,可能造成永遠阻塞。

行鎖(偏寫)

  • 偏向InnoDB存儲引擎,開銷大,加鎖慢,會出現死鎖,;鎖定粒度最小,發生鎖沖突的概率最低,并發度最高。
  • InnoDB不同于MYISAM的是:
    1.支持事務(TRANSACTION);
    2.采用了行級鎖。
事務及其ACID屬性:事務是由一組SQL語句組成的邏輯處理單元;1.原子性(Atomicity):事務是一個原子操作單元,其對數據的修改,要么全部執行,要么全部不執行;2.一致性(Consistent):在事務開始和完成時,數據都必須保持一致狀態;所有相關的事務規則都必須應用于事務的修改,以保持數據的完整性;事務結束后,所有的內部數據結構(如B+Tree索引/雙向鏈表)也都必須是正確的;3.隔離性(Isolation):數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的“獨立”環境執行,意味著事務處理過程的中間狀態對外部不可見;4.持久性(Durable):事務完成后,對于數據的修改是永久性的。 并發事務處理帶來的問題有哪些?1.更新丟失(Lost Update)2.臟讀(Dirty Reads)3.不可重復讀(Non-Repeatable Reads)4.幻讀(Phantom Reads) tips:MYSQL默認是可重復讀(Repeatable Reads); 行鎖是獨立的,互不相同的行之間互不干擾

注意:索引失效可能會使行鎖變表鎖,尤其varchar類型必須加’’;

間隙鎖及危害

  • 當用范圍條件檢索數據時,InnoDB會給符合條件的已有的數據記錄的索引項加鎖,對于鍵值在條件范圍內但不存在的記錄稱為“間隙(GAP)”,InnoDB也會對這種“間隙”加鎖,這種鎖機制稱為“間隙鎖(Next-Key)”
  • 鎖定的時候無法插入鎖定鍵值范圍內的任何數據。
    eg:
session1:update test_innodb_lock set b=a*20 where a>1 and a<6; session2: insert into test_innodb_lock values(2,'100'); //即使2不存在,但屬于1-5范圍內,便會被鎖定,產生阻塞,不能插入 session1: commit; session2等待阻塞完成,成功插入

如何鎖定一行?
select xxx for update鎖定一行后,其他的操作會被阻塞,只有鎖定行的會話提交commit才會繼續其他操作,需要等待。

總結: MYISAM適合讀鎖(比如APP大量瀏覽數據),InnoDB適合寫鎖(比如APP搜索很多關鍵字并進行交易)。

總結

以上是生活随笔為你收集整理的表锁与行锁的区别以及适用情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。