資料庫鎖按照鎖的粒度劃分,可分為表級鎖、行級鎖、頁級鎖;按照鎖級別劃分,可分為共享鎖、排他鎖;按照加鎖方式劃分,可分為自動鎖、顯式鎖;按照操作劃分,可分為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區別於其他資料庫的最重要的特...