拼多多相關面試題

1、事務的ACID,其中把事務的隔離性詳細解釋一遍?

事務其實就是單個數據邏輯單元組成的對象操作集合,而數據庫的終極目標就是使數據庫從一個一致的狀態換成另外一個一致的狀態。ACID中的一致性,原子性,隔離性,持久性就是爲了實現該目標。

一個事務是一連串的操作組成增刪改查的集合,就好比java方法一樣,java方法中有N條語句對屬性進行修改,在java與劇中,有一個語句執行出現了問題導致拋出了異常,相當於這個方法只執行了一半。如果只執行一半的話,那麼的他的一致性很有可能遭到破壞。所以原子性就是要求你一個方法要麼全部執行成功,要不就不執行。所以原子性是一致性的必要條件。但是隻保證了原子性不能說就能保證其一致性。

因爲原子性保證了,一個事務未提交的時候,發生了錯誤就執行回滾,那麼事務就不會提交,但是當事務執行成功了,commit之後會讓事務刷盤,進行持久化操作,但刷盤的過程中如果出現了某些因素導致刷盤中斷。事務的持久性就保證這種問題發生,當數據庫因爲某種原因宕機的或,重啓的時候,數據庫會根據提交日誌進行回滾,將未寫完的數據寫入進去。

原子性,持久性是事務一致性的充分條件,還有一個問題就是線程安全的問題,數據庫是支持併發訪問的,這自然而然就會導致線程安全的問題。事物的隔離性則解決了這種線程安全問題。併發事務下,多個事務有自己的事務空間,相互獨立互不干擾。在java方法中,不同的方法都有自己的棧幀,雖然多個線程調用同一個方法,但是不同進程進入這個方法的棧幀是相互獨立的。如果你在這個類中定義了成員變量,線程在工作的時候,會將主內存中的數據拷貝到工作內存的棧幀中。這樣對數據的任何操作都是基於工作內存,並且不能直接操作主內存以及其他線程內存中的數據,之後將更新的數據刷到主內存中。這種會引發線程安全的問題。

事務的隔離性,就是多個併發事務都是獨立事務上下文的,彼此之間相互隔離的,但是多個事務如果對共享數據進行查看,刪除,修改的話,會出現線程安全的問題,需要使用鎖機制。當線程A修改,讓線程B不要來查看共享數據,除非A修改完畢。數據庫封裝了四把鎖,對應四種隔離級別

不考慮事務的隔離性,可能產生的問題

1、髒讀:當一個事務多次修改某個數據,這個事務的多次修改還未提交,另外一個併發事務來訪問該數據,導致得到的數據不一致。例如當A用戶給用戶B轉賬100;對應SQL

update account set money=money+100 where name=’B’;  (此時A通知B)
update account set money=money - 100 where name=’A’;                                                              

當執行第一條sql,B確實錢已到賬發生了髒讀,之後無論第二條SQL是否執行,只要不提交事務,所有操作都回滾,錢沒啦

2、不可重複讀:對於數據庫中的某一個數據,一個事務範圍內多次查詢返回了不同的數據值,這是因爲在查詢的過程中,被另外一個事務修改並提交了

事務A讀取某一數據,事務B立馬修改了這個數據並且提交給數據庫,事務A再度讀取就得到了不同的結果,發生了不可重複度。

3、虛讀:事務A對一個表中的所有數據做了從1修改爲2的操作,這時事務B又插入了一條數據,而這個數據項的數值還是1並且提交給數據庫,而操作事務A的用戶查看剛剛修改的數據,會發現還有一行沒有修改

幻讀和不可重複讀都是讀取了另一條已經提交的事務,所不同的是不可重複讀查詢的都是同一個數據項,可以理解爲針對update和delete操作,而幻讀則是針對一批數據,理解爲Insert操作

1、讀未提交(都不能保證)。隔離級別最低,允許髒讀,換句話說,如果一個事務正在處理某一數據,並對其進行了更新,但同時沒有提交事務,允許另外一個事務也可以訪問

2、讀已提交(避免髒讀)。和讀未提交的區別就是,讀未提交可以讀取到別人沒有提交的數據,讀已提交只能讀取別人提交後的值。事務進行的中間值不會讀取到

3、可重複度(避免髒讀,不可重複讀),簡單來說就是事務處理過程中多次讀取同一個數據的時候,這個值不會發生改變,其值都和第一次查詢到的數據是一致的。

4、串行化(避免髒讀,不可重複讀,幻讀)。是最嚴格的隔離級別,要求所有的事務都被串行化,即事務只能一個一個進行處理,不能併發執行

2、紅黑樹,二叉樹的算法?

 紅黑樹又成紅黑二叉樹,首先它是一顆二叉樹,具有二叉樹的所有特性,同時紅黑樹更是一顆自平衡的排序二叉樹

二叉樹需要滿足一個基本性值-樹中的任何節點的值大於它的左子節點,小於它的右子節點。按照這個基本性值使得樹的檢索效率大大提升

平衡二叉樹特性:是一顆空樹或它的左右子樹的高度差絕對值不超過1,並且左右倆個子樹都是一顆平衡二叉樹

紅黑樹顧名思義就是節點是紅色或者黑色的平衡二叉樹,通過顏色約束維持二叉樹的平衡,紅黑樹的規則:

1、每個節點只能是紅色或者黑色

2、根節點是黑色的

3、每個葉節點是黑色的

4、如果一個節點是紅的,則它倆個子節點是黑的,也就是說在一條路徑上不能出現相鄰的倆個紅色節點

5、從任一節點到其每個葉子的所有路徑都包含相同數目的黑節點

在添加或刪除節點後,紅黑樹就發生了變化,可能就不滿足上述5個特性,爲了保持,就有了三個動作:左旋,右選,着色

左旋:

右旋: 

3、平常用到哪些集合類?ArrayList和LinkedList區別?HashMap內部數據結構?ConcurrentHashMap分段鎖? 

ArrayList,LinkedList,HashMap, HashTable,ConcurrentHashMap

ArrayList採用的是數組的形式來保存對象的,這種方式將對象放在連續的位置上,所以查詢塊,不過增刪效率慢

LinkedList採用的是將對象放在獨立的空間中,每個空間中保存下一個鏈接的索引,增刪快,但查詢慢,要從第一個索引依次查詢。

HashMap和HashTable的區別?

都實現了Map接口;不過它們繼承的父類不同,HashTable繼承自Dictionary類,而HashMap繼承AbstractMap類

Hashtable的方法是synchronize,線程安全

Hashtable中key,value都不允許出現null值,HashMap中,null可以作爲鍵,這樣的鍵只有一個,可以有一個或多個鍵對應的值爲null

哈希值的使用不同,Hashtable直接使用對象的hashcode,而HashMap重新計算hash值

內部實現使用的數組初始化和擴容方式不同,Hashtable默認容量11,擴容方式old*2+1;而HashMap默認16,擴容是2的整次冪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章