計算機考研複試面試常問問題 資料庫篇
在複習過程中,我用心查閱並整理了在考研複試面試中可能問到的大部分問題,並分點整理了答案,可以直接理解背誦並加上自己的語言潤色!極力推薦列印下來看,效率更高!絕對良心之作!此系列一共有8篇:程式語言篇|數據結構篇|作業系統篇|組成原理篇|計算機網絡篇|資料庫篇|軟體工程篇|計算機專業英語篇(還未全部完成,敬請期待,你們的支持和關注是我最大的動力!)需要pdf直接列印版,可在gongzonghao"程式設計師寶藏"回復複試上岸獲取(會持續更新)相對於408初試,複試需要的少多了,加油,大家都可以上岸!!!讓我們一起努力!!!
1.事務
概念:事務指的是滿足 ACID 特性的一組操作,可以通過 Commit 提交一個事務,也可以使用 Rollback 進行回滾。
ACID特性:(1)原子性 (Atomicity):事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。回滾可以用回滾日誌來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。(2)一致性 (Consistency):資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。(3)隔離性 (Isolation):一個事務所做的修改在最終提交以前,對其它事務是不可見的。(4)持久性 (Durability):一旦事務提交,則其所做的修改將會永遠保存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。
使用重做日誌來保證持久性。
事務的 ACID 特性概念簡單,但不是很好理解,主要是因為這幾個特性不是一種平級關係:只有滿足一致性,事務的執行結果才是正確的。在無並發的情況下,事務串行執行,隔離性一定能夠滿足。此時只要能滿足原子性,就一定能滿足一致性。在並發的情況下,多個事務並行執行,事務不僅要滿足原子性,還需要滿足隔離性,才能滿足一致性。事務滿足持久性是為了能應對資料庫崩潰的情況。
2.並發一致性問題
丟失數據
丟失數據: 和 兩個事務都對一個數據進行修改, 先修改, 隨後修改, 的修改覆蓋了 的修改。簡記為 同時修改。
讀髒數據
讀髒數據: 對一個數據做了修改, 讀取這一個數據。若 執行 ROLLBACK 操作,則 讀取的結果和第一次的結果不一樣。簡記為 讀取失敗的修改。最簡單的場景是修改完成後,緊接著查詢檢驗結果。
不可重複讀
不可重複讀: 讀取一個數據, 對該數據做了修改。如果 再次讀取這個數據,此時讀取的結果和第一次讀取的結果不同。簡記為 讀時修改,重複讀取的結果不一樣。
幻影讀
幻影讀: 讀取某個範圍的數據, 在這個範圍內插入新的數據, 再次讀取這個範圍的數據,此時讀取的結果和和第一次讀取的結果不同。簡記為 讀時插入,重複讀取的結果不一樣。
解決方案
在並發環境下,事務的隔離性很難保證,因此會出現很多並發一致性問題。產生並發不一致性問題的主要原因是破壞了事務的隔離性。解決方法是通過 並發控制 來保證隔離性。並發控制可以通過 封鎖 來實現,但是封鎖操作需要用戶自己控制,相當複雜。資料庫管理系統提供了事務的 隔離級別,讓用戶以一種更輕鬆的方式處理並發一致性問題。
3.封鎖
封鎖粒度MySQL 中提供了兩種封鎖粒度:行級鎖 以及 表級鎖。應儘量只鎖定需要修改的那部分數據,而不是所有的資源。鎖定的數據量越少,發生鎖爭用的可能就越小,系統的並發程度就越高。但是加鎖需要消耗資源,鎖的各種操作 (包括獲取鎖、釋放鎖、以及檢查鎖狀態) 都會增加系統開銷。因此封鎖粒度越小,系統開銷就越大。為此,我們在選擇封鎖粒度時,需在 鎖開銷 和 並發程度 之間做一個 權衡。
封鎖類型
(1)讀寫鎖排它鎖 (Exclusive),簡寫為 X 鎖,又稱 寫鎖。共享鎖 (Shared),簡寫為 S 鎖,又稱 讀鎖。有以下兩個規定:一個事務對數據對象 A 加了 X 鎖,就可以對 A 進行讀取和更新。加鎖期間其它事務不能對 A 加任何鎖。一個事務對數據對象 A 加了 S 鎖,可以對 A 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 A 加 S 鎖,但是不能加 X 鎖。
(2)意向鎖使用意向鎖 (Intention Locks),可以更容易地支持多粒度封鎖,使得行鎖和表鎖能夠共存。在存在行級鎖和表級鎖的情況下,事務 T 想要對表 A 加 X 鎖,就需要先檢測是否有其它事務對表 A 或者表 A 中的任意一行加了鎖,那麼就需要對表 A 的每一行都檢測一次,這是非常耗時的。意向鎖在原來的 X/S 鎖之上引入了 IX / IS,IX / IS 都是 表級別的鎖,用來表示一個事務稍後會對表中的某個數據行上加 X 鎖或 S 鎖。整理可得以下兩個規定:一個事務在獲得某個數據行對象的 S 鎖之前,必須先獲得表的 IS 鎖或者更強的鎖;一個事務在獲得某個數據行對象的 X 鎖之前,必須先獲得表的 IX 鎖。
封鎖協議
三級封鎖協議一級封鎖協議:事務 T 要修改數據 A 時必須加 X 鎖,直到 T 結束才釋放鎖。防止同時修改,可解決 丟失修改 問題,因不能同時有兩個事務對同一個數據進行修改,那麼事務的修改就不會被覆蓋。二級封鎖協議:在一級的基礎上,要求讀取數據 A 時必須加 S 鎖,讀取完馬上釋放 S 鎖。防止修改時讀取,可解決 丟失修改 和 讀髒數據 問題,因為一個事務在對數據 A 進行修改,根據 1 級封鎖協議,會加 X 鎖,那麼就不能再加 S 鎖了,也就是不會讀入數據。三級封鎖協議:在二級的基礎上,要求讀取數據 A 時必須加 S 鎖,直到事務結束了才能釋放 S 鎖。防止讀取時修改,可解決 丟失修改 和 讀髒數據 問題,還進一步防止了 不可重複讀 的問題,因為讀 A 時,其它事務不能對 A 加 X 鎖,從而避免了在讀的期間數據發生改變。
兩段鎖協議兩段鎖協議是指每個事務的執行可以分為兩個階段:生長階段 (加鎖階段) 和衰退階段 (解鎖階段)。兩段封鎖法可以這樣來實現:事務開始後就處於加鎖階段,一直到執行 ROLLBACK 和 COMMIT 之前都是加鎖階段。ROLLBACK 和 COMMIT 使事務進入解鎖階段,即在 ROLLBACK 和 COMMIT 模塊中 DBMS 釋放所有封鎖