其它MySQL 面試系列:
MySQL 面試系列:MySQL查詢?nèi)绾芜M(jìn)行優(yōu)化?
MySQL 面試系列:一條select語句在MySQL是這樣執(zhí)行的?
MySQL 面試系列:MySQL 常見的開放性問題
MySQL 面試系列:MySQL 性能優(yōu)化 & 分布式
MySQL 面試系列:MySQL 命令和內(nèi)置函數(shù)
MySQL 面試系列:MySQL 中日志的面試題總結(jié)
MySQL 面試系列:MySQL 中鎖的面試題總結(jié)
MySQL 面試系列:MySQL 事務(wù)的面試題總結(jié)
MySQL 面試系列:MySQL 索引的面試題總結(jié)
MySQL 面試系列:MySQL 基礎(chǔ)模塊的面試題總結(jié)
什么是鎖?MySQL 中提供了幾類鎖?
鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的重要手段纸厉,可以保證數(shù)據(jù)庫在多人同時(shí)操作時(shí)能夠正常運(yùn)行莽囤。MySQL 提供了全局鎖、行級鎖房官、表級鎖趾徽。其中 InnoDB 支持表級鎖和行級鎖,MyISAM 只支持表級鎖翰守。
什么是死鎖孵奶?
是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去蜡峰。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖了袁,這些永遠(yuǎn)在互相等待的過程稱為死鎖。
死鎖是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中湿颅,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去载绿。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的過程稱為死鎖油航。
常見的死鎖案例有哪些崭庸?
將投資的錢拆封幾份借給借款人,這時(shí)處理業(yè)務(wù)邏輯就要把若干個借款人一起鎖住 select * from xxx where id in (xx,xx,xx) for update。
批量入庫冀自,存在則更新揉稚,不存在則插入。解決方法 insert into tab(xx,xx) on duplicate key update xx='xx'熬粗。
如何處理死鎖搀玖?
對待死鎖常見的兩種策略:
通過 innodblockwait_timeout 來設(shè)置超時(shí)時(shí)間,一直等待直到超時(shí)驻呐;
發(fā)起死鎖檢測灌诅,發(fā)現(xiàn)死鎖之后,主動回滾死鎖中的某一個事務(wù)含末,讓其它事務(wù)繼續(xù)執(zhí)行猜拾。
如何查看死鎖?
使用命令 show engine innodb status 查看最近的一次死鎖佣盒。
InnoDB Lock Monitor 打開鎖監(jiān)控挎袜,每 15s 輸出一次日志。使用完畢后建議關(guān)閉肥惭,否則會影響數(shù)據(jù)庫性能盯仪。
如何避免死鎖?
為了在單個 InnoDB 表上執(zhí)行多個并發(fā)寫入操作時(shí)避免死鎖蜜葱,可以在事務(wù)開始時(shí)通過為預(yù)期要修改的每個元祖(行)使用 SELECT … FOR UPDATE 語句來獲取必要的鎖全景,即使這些行的更改語句是在之后才執(zhí)行的。
在事務(wù)中牵囤,如果要更新記錄爸黄,應(yīng)該直接申請足夠級別的鎖,即排他鎖揭鳞,而不應(yīng)先申請共享鎖炕贵、更新時(shí)再申請排他鎖,因?yàn)檫@時(shí)候當(dāng)用戶再申請排他鎖時(shí)汹桦,其他事務(wù)可能又已經(jīng)獲得了相同記錄的共享鎖鲁驶,從而造成鎖沖突,甚至死鎖
如果事務(wù)需要修改或鎖定多個表舞骆,則應(yīng)在每個事務(wù)中以相同的順序使用加鎖語句钥弯。在應(yīng)用中,如果不同的程序會并發(fā)存取多個表督禽,應(yīng)盡量約定以相同的順序來訪問表脆霎,這樣可以大大降低產(chǎn)生死鎖的機(jī)會通過 SELECT … LOCK IN SHARE MODE
獲取行的讀鎖后,如果當(dāng)前事務(wù)再需要對該記錄進(jìn)行更新操作狈惫,則很有可能造成死鎖睛蛛。
改變事務(wù)隔離級別鹦马。
InnoDB 默認(rèn)是如何對待死鎖的?
InnoDB 默認(rèn)是使用設(shè)置死鎖時(shí)間來讓死鎖超時(shí)的策略忆肾,默認(rèn) innodblockwait_timeout
設(shè)置的時(shí)長是 50s荸频。
如何開啟死鎖檢測?
設(shè)置 innodbdeadlockdetect 設(shè)置為 on 可以主動檢測死鎖客冈,在 Innodb 中這個值默認(rèn)就是 on 開啟的狀態(tài)旭从。
什么是全局鎖?它的應(yīng)用場景有哪些场仲?
全局鎖就是對整個數(shù)據(jù)庫實(shí)例加鎖和悦,它的典型使用場景就是做全庫邏輯備份。 這個命令可以使整個庫處于只讀狀態(tài)渠缕。使用該命令之后陌凳,數(shù)據(jù)更新語句粘驰、數(shù)據(jù)定義語句、更新類事務(wù)的提交語句等操作都會被阻塞谅猾。
什么是共享鎖夜只?
共享鎖又稱讀鎖 (read lock)艺栈,是讀取操作創(chuàng)建的鎖捎泻。其他用戶可以并發(fā)讀取數(shù)據(jù)诬乞,但任何事務(wù)都不能對數(shù)據(jù)進(jìn)行修改(獲取數(shù)據(jù)上的排他鎖),直到已釋放所有共享鎖谁不。當(dāng)如果事務(wù)對讀鎖進(jìn)行修改操作,很可能會造成死鎖徽诲。
什么是排它鎖刹帕?
排他鎖 exclusive lock(也叫 writer lock)又稱寫鎖。
若某個事物對某一行加上了排他鎖谎替,只能這個事務(wù)對其進(jìn)行讀寫偷溺,在此事務(wù)結(jié)束之前,其他事務(wù)不能對其進(jìn)行加任何鎖钱贯,其他進(jìn)程可以讀取,不能進(jìn)行寫操作挫掏,需等待其釋放。
排它鎖是悲觀鎖的一種實(shí)現(xiàn)秩命,在上面悲觀鎖也介紹過尉共。