MySQL 技術內幕 鎖模組

2021-10-01 01:26:41 字數 3388 閱讀 1899

資料庫鎖按照鎖的粒度劃分,可分為表級鎖、行級鎖、頁級鎖;按照鎖級別劃分,可分為共享鎖、排他鎖;按照加鎖方式劃分,可分為自動鎖、顯式鎖;按照操作劃分,可分為dml 鎖、ddl 鎖;按照使用方式劃分,可分為樂觀鎖、悲觀鎖。

1、myisam 與 innodb 關於鎖方面的區別是什麼?

myisam 預設用的是表級鎖,不支援行級鎖。

對於 insert、update、delete,myisam 會自動加乙個表級別的寫鎖 (排他鎖);對於 select 會自動加乙個表級別的讀鎖 (共享鎖)。

可以通過以下 sql 顯式的加讀鎖或寫鎖:

lock

tables person_info_myisam read

;// myisam 讀鎖

lock

tables person_info_myisam write

;// myisam 寫鎖

unlock

tables

;// myisam 釋放讀鎖

// myisam select 預設加讀鎖

select..

.for

update

;// myisam select 加寫鎖

innodb 預設用的是行級鎖,也支援表級鎖。需要注意的是,innodb 在 sql 沒有用到索引的時候,走的依然是表級鎖,只有 sql 用到索引的時候走的是行級鎖。

在 sql 用到索引的時候,對於 insert、update、delete,innodb 會自動給涉及的資料行加乙個寫鎖 (排他鎖);對於 select 不會加任何鎖。

事務可以通過以下 sql 顯式的加讀鎖或寫鎖:

select..

.lock

inshare

mode

;// innodb select 加讀鎖

select..

.for

update

;// innodb select 加寫鎖

與 myisam 相比,由於 innodb 支援事務,所以 innodb 使用的是二段鎖,二段鎖即加鎖和解鎖是分為兩個步驟來進行的,即先對同乙個事務裡的一批操作分別進行加鎖,然後到 commit (提交) 的時候再對事務裡加上的鎖進行統一的解鎖。

myisam 適合的場景:

innodb 適合的場景:

為什麼 myisam 查詢速度比 innodb 快?

2、使用 mysql 實現樂觀鎖?

資料庫表裡可以增加乙個 version 字段,查詢資料的時候將 version 也查詢出來,資料每更新一次,version + 1,當提交更新的時候,判斷當前 version 與第一次取出來的是否相等,如果相等則更新,否則認為是過期資料。這就是樂觀鎖的一種實現方式。

3、資料庫事務的四大特性?

資料庫事務的四大特性即 acid:

說明原子性(atomic)

事務包含的所有操作要麼全部執行,要麼全部失敗回滾。

一致性(consistency)

事務應確保資料庫的狀態從乙個一致狀態轉變為另外乙個一致狀態。

隔離性(isolation)

多個事務併發執行時,乙個事務的執行不應該影響其他事務的執行。

永續性(durability)

乙個事務一旦提交,它對資料庫的修改應該永久儲存在資料庫中。

隔離性是重點。

4、併發訪問產生的問題以及事務隔離機制?

mysql 會利用鎖機制建立出不同的事務隔離級別,下面將按照事務隔離級別從低到高的順序,看下由於併發訪問產生的問題:

問題說明

解決更新丟失

mysql 所有事務隔離級別在資料庫層面上均可避免

髒讀a 事務讀取 b 事務尚未提交的資料,此時如果 b 事務發生回滾,那麼 a 事務讀取到的資料就是髒資料

read-committed 事務隔離級別以上可避免

不可重複讀

a 事務前後多次讀取同一條資料 。在 a 事務第一次讀取資料後,b 事務執行了更改操作,此時 a 事務第二次讀取到資料時,發現和之前的資料不一樣了,成為不可重複讀

repeatable-read 事務隔離級別以上可避免

幻讀a 事務執行讀取操作,需要兩次統計資料的總量,前一次查詢資料總量後,b 事務執行了新增資料的操作並完成提交,此時 a 事務再讀取資料總量,發現和之前統計的不一樣,成為幻讀。

sertalizable 事務隔離級別可避免

不可重複讀和幻讀有什麼區別?

不可重複讀是讀取了其他事務更改的資料,針對 insert、update,解決:可以使用行級鎖鎖定該行,a 事務多次讀取操作完成後才釋放該鎖,這個時候才允許其他事務更改剛才的資料。

幻讀是讀取了其他事務新增的資料,針對 insert、delete,解決:使用表級鎖,鎖定整張表,a 事務多次讀取資料總量之後才釋放該鎖,這個時候才允許其他事務新增資料。

事務隔離機制:

隔離級別\問題

更新丟失

髒讀不可重複讀

幻讀未提交讀

可避免會發生

會發生會發生

已提交讀(rc,read-committed)

可避免可避免

會發生會發生

可重複讀(rr,repeatable-read)

可避免可避免

可避免會發生

序列化(sertalizable)

可避免可避免

可避免可避免

5、innodb 可重複讀 (rr) 隔離級別下如何避免幻讀?

可重複讀隔離級別理論上避免不了幻讀,而是通過一種巧妙的方式規避了幻讀。分為表象和內在:

當前讀:

select..

.lock

inshare

mode

;# 讀鎖(共享鎖)

select..

.for

update

;# 寫鎖(排他鎖)

update..

.;# 寫鎖

delete..

.;# 寫鎖

insert..

.;# 寫鎖

快照讀:不加鎖的非阻塞讀,select。

可重複讀 (rr) 隔離級別下避免幻讀,根本原因是事務對資料加了 next-key 鎖,next-key 鎖由行鎖 + gap 鎖組成:

可重複讀 (rr) 隔離級別下 gap 鎖出現的場景:

不論 delete、update、select,當前讀若用到主鍵索引或者唯一索引會用到 gap 鎖嗎?

gap 鎖會用在非唯一索引或者不走索引的當前讀中。

6、已提交讀 (rc)、可重複讀 (rr) 級別下的 innodb 的非阻塞讀如何實現?

MySQL技術內幕 44 鎖公升級

鎖公升級 lock escalation 是指將當前鎖的粒度降低。舉例來說,資料庫可以把乙個表的1000個行鎖公升級為乙個頁鎖,或者將頁鎖公升級為表鎖。如果在資料庫的設計中認為鎖是一種稀有資源,而且想避免鎖的開銷,那資料庫中會頻繁出現鎖公升級現象。microsoft sql server資料庫的設計...

MySQL技術內幕

innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...

MySQL技術內幕(一)

1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...