實現了一個關系型數據庫。主要功能: Database Index, B+ Tree, Query Optimization, Locks
Table的實現:
數據庫Table 一般要告訴他你能儲存什么樣的值,比如說Age int, Name String 之類的。
所以先定義一下Table Schema:
fields就是col names。 fieldTypes是與col對應的數據類型
比如說Age 對應Int。
數據在Database里是以Byte的形式存在的:
我們要把給的數據變成byte,存起來。所以實現了一個Encoding的函數。
在讀取的時候,用戶當然不希望讀到Byte,所以還要給一個Decoding成原樣的方法:
這個時候可以看出來Field_type的原因了,我們把數據變成Byte以后誰也不知道這里col里的東西是個啥。但是Field-Type記錄了這里放的是比如說String,到時候我們就以String的方式來讀取這個Byte。
Table:
首先要有一個Page的概念,因為數據是存放在一個Page 一個Page里的。 然后我們會用一個Head-Page 它知道哪個Page現在有空余位置。
添加Record:
首先看看要加的數據類型是對的。然后找第一張Free Page。?
B+ Tree:
算是一個索引,方便查找東西。
兩個部分: Node的實現和 Tree本身的實現
B+ tree class里主要實現了一個Iterator.?
鎖:【設計了很多多線程, 這個主要為了模擬并發情況】
為了管理鎖的優先問題,我們做了一個鎖管理員類,負責哪個線程/進程該拿到鎖access 某個Table。
Lock Object,這里運用到了很多的多線程?。。?!
Lock 知道自己的Owner是誰,以及有一個TransactionQueue
排隊有人等lock。
如果當前Lock object里是空的話, owner設置為新的這個transNum, 類型設置為Transnum要的類型。
如果Lock里有人占了,是Exclusive的話, 那你就不能干啥。
如果Lock有人占了,但是只是shared lock的話。那你還可以去排隊看看。如果當前Lock里占用的是Shared Lock, 你也要申請share,但是隊列之前有一個exclusive在排隊,你就不能。
while(!notifyLocks)
? ? ? {
? this.wait(); ? ?
}
這里實現了兩種鎖,share和Exclusive。并且管理員有著一個Graph,可以判斷現在有沒有出現dead lock。
判斷有沒有dead lock的辦法就是判斷這個directed Graph有沒有組成cycle:?
首先建一個Graph:
當年真是菜的不行,我還記得這個cycle DFS detection還是我去Greeks網上copy paste的。
處理Potential Deadlock:
每當有進程要來要鎖,我們都會確認一下這個Process拿到鎖的話不會導致出現deadlock. 所以我們就是把這個Transaction加入Graph里,看看它和別的Transaction的edge 情況。如果發現導致cycle了,我們就拋出異常。【并且我們并沒有加入這個Transaction進入Graph組成edge】這邊有一個很Tricky的地方,對于Share Lock.因為share的lock可以被多個共享。我們要check每一種情況,比如說1 和 2如果有edge會不會有cycle。 1和3有edge 會不會有cycle。。。