講解mysql數據庫排序規則「mysql數據庫類型有哪些」

一、數據庫為什麼需要鎖?

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

二、表級鎖

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

(1)鎖定粒度大,鎖衝突概率高、並發度低;

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

(3)使用表級鎖定的主要是MyISAM,MEMORY,CSV等一些非事務性存儲引擎,適用於以查詢為主,少量更新的應用。

三、行級鎖

1.行級鎖

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

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

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

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

2.InnoDB行級鎖類型

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

(2)排他鎖:又稱寫鎖,排他鎖就是不能與其他鎖並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,只有獲取排他鎖的事務可以對數據進行讀取和修改。

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

3.注意事項

(1)排他鎖指的是一個事務在一行數據加上排他鎖後,其他事務不能再在其上加其他的鎖。但可以直接通過select …from…查詢數據,因為普通查詢沒有任何鎖機制。

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

數據庫常用的鎖有哪些?

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

4.適用場景

(1)共享鎖適用於:用來確認某行記錄是否存在,並確保沒有人對這個記錄進行UPDATE或者DELETE操作,如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖。

(2) 排他鎖適用於:鎖定行記錄後需要進行更新操作的應用;

共享鎖(S):

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

排他鎖(X):

SELECT * FROM table_name WHERE ... FOR UPDATE

5.為什麼使用意向鎖?

提高了效率。

1.事務 A 先獲取了某一行的 排他鎖 ,並未提交:

SELECT * FROM users WHERE id = 6 FOR UPDATE;

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

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

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

SELECT * FROM users WHERE id = 5 FOR UPDATE;

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

  • 事務 C 檢測到 事務 A 持有 users 表的 意向排他鎖 。
  • 因為意向鎖之間並不互斥,所以 事務 C 獲取到了 users 表的 意向排他鎖 。
  • 因為id 為 5 的數據行上不存在任何 排他鎖 ,最終 事務 C 成功獲取到了該數據行上的 排他鎖 。

四、頁面鎖

1.頁面鎖

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

(2)會發生死鎖;

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

五、關於鎖的常見問題

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

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

2.什麼時候使用行級鎖?什麼時候使用表級鎖?

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

3.行級鎖鎖的是什麼?行級鎖怎麼實現加鎖?

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

(2) InnoDB行鎖是通過索引上的索引項來實現的,這一點MySQL與Oracle不同,後者是通過在數據中對相應數據行加鎖來實現的。

4.mysql讀鎖和寫鎖?

(1)因為只有觸發了讀寫鎖,我們才會談是進行行級鎖定還是進行表級鎖定;

(2)用select 命令時觸發讀鎖,當使用update,delete,insert時觸發寫鎖,並且使用rollback或commit後解除本次鎖定。

5.常見的鎖算法:

next KeyLocks鎖,同時鎖住記錄(數據),並且鎖住記錄前面的Gap

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

Recordlock鎖(鎖數據,不鎖Gap)

所以其實 Next-KeyLocks=Gap鎖+ Recordlock鎖

6.什麼時候會釋放鎖?

提交事務或回滾事務就會釋放鎖。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/272949.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:03
下一篇 2024-12-17 14:03

相關推薦

發表回復

登錄後才能評論