<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          了解數(shù)據(jù)庫的鎖有多少嗎

          共 2420字,需瀏覽 5分鐘

           ·

          2021-07-31 01:25

          一、數(shù)據(jù)庫為什么需要鎖?

          為了保證數(shù)據(jù)的一致性。mysql數(shù)據(jù)庫存在多種數(shù)據(jù)引擎,MySQL各存儲引擎使用了三種類型(級別)的鎖定機(jī)制:表級鎖定,行級鎖定和頁級鎖定。

          二、表級鎖

          1.表級鎖(表級鎖一次會將整個(gè)表鎖定,所可以很好的避免死鎖問題)

          (1)鎖定粒度大,鎖沖突概率高、并發(fā)度低;

          (2)好處是不會出現(xiàn)死鎖、開銷小、獲取鎖和釋放鎖的速度很快;

          (3)使用表級鎖定的主要是MyISAM,MEMORY,CSV等一些非事務(wù)性存儲引擎,適用于以查詢?yōu)橹鳎倭扛碌膽?yīng)用。

          三、行級鎖

          1.行級鎖

          (1)好處是鎖定對象的顆粒度很小,發(fā)生鎖沖突的概率低、并發(fā)度高;

          (2)缺點(diǎn)是開銷大、加鎖慢,行級鎖容易發(fā)生死鎖;

          詳解mysql死鎖問題https://blog.csdn.net/Michaeles/article/details/86484716

          (3)使用行級鎖定的主要是InnoDB存儲引擎、及分布式存儲引擎NDBCluster等。適用于對事務(wù)完整性要求較高的系統(tǒng)。InnoDB支持行級鎖(row-level locking)和表級鎖,默認(rèn)為行級鎖。

          2.InnoDB行級鎖類型

          (1)共享鎖:又稱讀鎖,簡單講就是多個(gè)事務(wù)對同一數(shù)據(jù)進(jìn)行共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。

          (2)排他鎖:又稱寫鎖,排他鎖就是不能與其他所并存,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,只有獲取排他鎖的事務(wù)可以對數(shù)據(jù)進(jìn)行讀取和修改。

          (3)意向鎖是InnoDB自動加的,不需用戶干預(yù)。意向鎖不會與行級的共享 / 排他鎖互斥!!!

          3.注意事項(xiàng)

          (1)排他鎖指的是一個(gè)事務(wù)在一行數(shù)據(jù)加上排他鎖后,其他事務(wù)不能再在其上加其他的鎖。但可以直接通過select ...from...查詢數(shù)據(jù),因?yàn)槠胀ú樵儧]有任何鎖機(jī)制。

          (2)mysql InnoDb引擎中update,delete,insert語句自動加排他鎖;

          意向鎖之間是互相兼容的,意向共享鎖和普通共享鎖之間是兼容的。

          4.適用場景

          (1)共享鎖適用于:用來確認(rèn)某行記錄是否存在,并確保沒有人對這個(gè)記錄進(jìn)行UPDATE或者DELETE操作,如果當(dāng)前事務(wù)也需要對該記錄進(jìn)行更新操作,則很有可能造成死鎖。

          (2) 排他鎖適用于:鎖定行記錄后需要進(jìn)行更新操作的應(yīng)用;

          共享鎖(S):

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

          排他鎖(X):

          SELECT * FROM table_name WHERE ... FOR UPDATE

          5.為什么使用意向鎖?

          提高了效率。

          1.事務(wù) A 先獲取了某一行的 排他鎖 ,并未提交:

          SELECT * FROM users WHERE id = 6 FOR UPDATE;

          (1)事務(wù) A 獲取了 users 表上的 意向排他鎖 。

          (2)事務(wù) A 獲取了 id 為 6 的數(shù)據(jù)行上的 排他鎖 。

          2.事務(wù) C 也想獲取 users 表中某一行的 排他鎖 :

          SELECT * FROM users WHERE id = 5 FOR UPDATE;

          (1)事務(wù) C 申請 users 表的 意向排他鎖 。

          • 事務(wù) C 檢測到 事務(wù) A 持有 users 表的 意向排他鎖 。
          • 因?yàn)橐庀蜴i之間并不互斥,所以 事務(wù) C 獲取到了 users 表的 意向排他鎖 。
          • 因?yàn)閕d 為 5 的數(shù)據(jù)行上不存在任何 排他鎖 ,最終 事務(wù) C 成功獲取到了該數(shù)據(jù)行上的 排他鎖 。

          四、頁面鎖

          1.頁面鎖

          (1)介于行級鎖和表級鎖之間;

          (2)會發(fā)生死鎖;

          (3)BDB采用頁面鎖(page-level locking)或表級鎖,默認(rèn)為頁面鎖。

          五、關(guān)于鎖的常見問題

          1.InnoDB存儲引擎什么時(shí)候會鎖住整張表(什么時(shí)候使用行級鎖),什么時(shí)候或只鎖住一行呢(使用行鎖)?

          只有通過索引條件查詢數(shù)據(jù),InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!記住:一定要記住為匹配條件字段加索引。

          2.什么時(shí)候使用行級鎖?什么時(shí)候使用表級鎖?

          (1)在增刪改查時(shí)匹配的條件字段不帶有索引時(shí),innodb使用的是表級鎖,

          3.行級鎖鎖的是什么?行級鎖怎么實(shí)現(xiàn)加鎖?

          (1)行級鎖是針對索引加的鎖;

          (2) InnoDB行鎖是通過索引上的索引項(xiàng)來實(shí)現(xiàn)的,這一點(diǎn)MySQL與Oracle不同,后者是通過在數(shù)據(jù)中對相應(yīng)數(shù)據(jù)行加鎖來實(shí)現(xiàn)的。

          4.mysql讀鎖和寫鎖?

          (1)因?yàn)橹挥杏|發(fā)了讀寫鎖,我們才會談是進(jìn)行行級鎖定還是進(jìn)行表級鎖定;

          (2)用select 命令時(shí)觸發(fā)讀鎖,當(dāng)使用update,delete,insert時(shí)觸發(fā)寫鎖,并且使用rollback或commit后解除本次鎖定。

          5.常見的鎖算法:

          next KeyLocks鎖,同時(shí)鎖住記錄(數(shù)據(jù)),并且鎖住記錄前面的Gap

          Gap鎖,不鎖記錄,僅僅記錄前面的Gap

          Recordlock鎖(鎖數(shù)據(jù),不鎖Gap)

          所以其實(shí) Next-KeyLocks=Gap鎖+ Recordlock鎖

          6.什么時(shí)候會釋放鎖?

          提交事務(wù)或回滾事務(wù)就會釋放鎖。

          來源:blog.csdn.net/Michaeles/article/details/86484385

          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操天天射 | 成人网址在线看 | 亚洲一区欧美一区 | 男女啪啪免费网站入口 | 熟女骚逼|