Java面試題解析(事務+緩存+數據庫+多線程+JVM)

事務

一、什麼是事務?事務的特性(ACID)

什麼是事務:事務是程序中一系列嚴密的操做,全部操做執行必須成功完成,不然在每一個操做所作的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。

事務特性分爲四個:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持續性(Durability)簡稱ACID。算法

  • 一、原子性:事務是數據庫的邏輯工做單位,事務中包含的各操做要麼都作,要麼都不作。
  • 二、一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。所以當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。若是數據庫系統運行中發生故障,有些事務還沒有完成就被迫中斷,這些未完成事務對數據庫所作的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是不一致的狀態。
  • 三、隔離性:一個事務的執行不能其它事務干擾。即一個事務內部的操做及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
  • 四、持久性:也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操做或故障不該該對其執行結果有任何影響。


二、事務的隔離級別有幾種,最經常使用的隔離級別是哪兩種?

併發過程當中會出現的問題:

丟失更新:是不可重複讀的特殊狀況。若是兩個事物都讀取同一行,而後兩個都進行寫操做,並提交,第一個事物所作的改變就會丟失。

髒讀:一個事務讀取到另外一個事務未提交的更新數據。

幻讀也叫虛讀:一個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的數據,形成兩次結果不一致,只是另外一個事務在這兩次查詢中間插入或刪除了數據形成的。

不可重複讀:一個事務兩次讀取同一行的數據,結果獲得不一樣狀態的結果,中間正好另外一個事務更新了該數據,兩次結果相異,不可被信任。

事務的隔離級別有4種:

一、未提交讀(Read uncommitted)

定義:就是一個事務讀取到其餘事務未提交的數據,是級別最低的隔離機制。

缺點:會產生髒讀、不可重複讀、幻讀。

二、提交讀(Read committed)

定義:就是一個事務讀取到其餘事務提交後的數據。Oracle默認隔離級別。

缺點:會產生不可重複讀、幻讀。

三、可重複讀(Repeatable read)

定義:就是一個事務對同一份數據讀取到的相同,不在意其餘事務對數據的修改。MySQL默認的隔離級別。

缺點:會產生幻讀。

四、串行化(Serializable)

定義:事務串行化執行,隔離級別最高,犧牲了系統的併發性。

缺點:能夠解決併發事務的全部問題。可是效率地下,消耗數據庫性能,通常不使用。



緩存

三、分佈式緩存的典型應用場景?

頁面緩存,用來緩存Web頁面的內容片斷,包括HTML、CSS 和圖片等,多應用於社交網站等。

應用對象緩存,緩存系統做爲ORM框架的二級緩存對外提供服務,目的是減輕數據庫的負載壓力,加速應用訪問。

狀態緩存,緩存包括Session會話狀態及應用橫向擴展時的狀態數據等,這類數據通常是難以恢復的,對可用性要求較高,多應用於高可用集羣。

並行處理,一般涉及大量中間計算結果須要共享。

事件處理,分佈式緩存提供了針對事件流的連續查詢(continuous query)處理技術,知足實時性需求。

極限事務處理,分佈式緩存爲事務型應用提供高吞吐率、低延時的解決方案,支持高併發事務請求處理,多應用於鐵路、金融服務和電信等領域。

數據庫

四、MongoDB與Mysql的區別?

兩種數據庫的區別:

傳統的關係型數據庫,數據是以表單爲媒介進行存儲的。

相比較Mysql,Mongodb以一種直觀文檔的方式來完成數據的存儲。

Mongodb的鮮明特徵:

自帶GirdFS的分佈式文件系統,這也爲Mongodb的部署提供了很大便利。

Mongodb內自建了對map-reduce運算框架的支持,雖然這種支持從功能上看還算是比較簡單的,至關於MySQL裏GroupBy功能的擴展版,不過也爲數據的統計帶來了方便。

Mongodb在啓動後將數據庫中得數據以文件映射的方式加載到內存中,若是內存資源至關豐富的話,這將極大的提升數據庫的查詢速度。

Mongodb的優點:

Mongodb適合那些對數據庫具體格式不明確或者數據庫數據格式常常變化的需求模型,並且對開發者十分友好。

Mongodb官方就自帶一個分佈式文件系統,Mongodb官方就自帶一個分佈式文件系統,能夠很方便的部署到服務器機羣上。

Mongodb的缺陷:

事務關係支持薄弱。這也是全部NoSQL數據庫共同的缺陷,不過NoSQL並非爲了事務關係而設計的,具體應用仍是很需求。

穩定性有些欠缺

方便開發者的同時,對運維人員提出了更高的要求。

Mongodb的應用場景:

表結構不明確且數據不斷變大:MongoDB是非結構化文檔數據庫,擴展字段很容易且不會影響原有數據。內容管理或者博客平臺等,例如圈子系統,存儲用戶評論之類的。

更高的寫入負載:MongoDB側重高數據寫入的性能,而非事務安全,適合業務系統中有大量「低價值」數據的場景。自己存的就是json格式數據。例如作日誌系統。

數據量很大或者未來會變得很大:Mysql單表數據量達到5-10G時會出現明細的性能降級,須要作數據的水平和垂直拆分、庫的拆分完成擴展,MongoDB內建了sharding、不少數據分片的特性,容易水平擴展,比較好的適應大數據量增加的需求。

高可用性:自帶高可用,自動主從切換(副本集):

不適用的場景:

MongoDB不支持事務操做,須要用到事務的應用建議不用MongoDB。

MongoDB目前不支持join操做,須要複雜查詢的應用也不建議使用MongoDB。

在帶「_id」插入數據的時候,MongoDB的插入效率其實並不高。若是想充分利用MongoDB性能的話,推薦採起不帶「_id」的插入方式,而後對相關字段做索引來查詢。

關係型數據庫和非關係型數據庫的應用場景對比:

關係型數據庫適合存儲結構化數據,如用戶的賬號、地址:

這些數據一般須要作結構化查詢,好比join,這時候,關係型數據庫就要勝出一籌。

這些數據的規模、增加的速度一般是能夠預期的。

事務性、一致性。

NoSQL適合存儲非結構化數據,如文章、評論:

這些數據一般用於模糊處理,如全文搜索、機器學習。

這些數據是海量的,並且增加的速度是難以預期的。

根據數據的特色,NoSQL數據庫一般具備無限(至少接近)伸縮性。

按key獲取數據效率很高,可是對join或其餘結構化查詢的支持就比較差。

五、Mysql索引相關問題。

1)什麼是索引?

索引實際上是一種數據結構,可以幫助咱們快速的檢索數據庫中的數據。

2)索引具體採用的哪一種數據結構呢?

常見的MySQL主要有兩種結構:Hash索引和B+ Tree索引,一般使用的是InnoDB引擎,默認的是B+樹。

3)InnoDb內存使用機制?

Innodb體系結構如圖所示:



Innodb關於查詢效率有影響的兩個比較重要的參數分別是innodb_buffer_pool_size,innodb_read_ahead_threshold:

innodb_buffer_pool_size指的是Innodb緩衝池的大小,該參數的大小可經過命令指定innodb_buffer_pool_size 20G。緩衝池使用改進的LRU算法進行管理,維護一個LRU列表、一個FREE列表,FREE列表存放空閒頁,數據庫啓動時LRU列表是空的,當須要從緩衝池分頁時,首先從FREE列表查找空閒頁,有則放入LRU列表,不然LRU執行淘汰,淘汰尾部的頁分配給新頁。

innodb_read_ahead_threshold相對應的是數據預加載機制,innodb_read_ahead_threshold 30表示的是若是一個extent中的被順序讀取的page超過或者等於該參數變量的,Innodb將會異步的將下一個extent讀取到buffer pool中,好比該參數的值爲30,那麼當該extent中有30個pages被sequentially的讀取,則會觸發innodb linear預讀,將下一個extent讀到內存中;在沒有該變量以前,當訪問到extent的最後一個page的時候,Innodb會決定是否將下一個extent放入到buffer pool中;能夠在Mysql服務端經過show innodb status中的Pages read ahead和evicted without access兩個值來觀察預讀的狀況:Innodb_buffer_pool_read_ahead:表示經過預讀請求到buffer pool的pages;Innodb_buffer_pool_read_ahead_evicted:表示因爲請求到buffer pool中沒有被訪問,而驅逐出內存的頁數。

能夠看出來,Mysql的緩衝池機制是能充分利用內存且有預加載機制,在某些條件下目標數據徹底在內存中,也可以具有很是好的查詢性能。

4)B+ Tree索引和Hash索引區別?

哈希索引適合等值查詢,可是沒法進行範圍查詢。

哈希索引沒辦法利用索引完成排序。

哈希索引不支持多列聯合索引的最左匹配規則。

若是有大量重複鍵值的狀況下,哈希索引的效率會很低,由於存在哈希碰撞問題。

5)B+ Tree的葉子節點均可以存哪些東西嗎?

InnoDB的B+ Tree可能存儲的是整行數據,也有多是主鍵的值。

6)這二者有什麼區別嗎?

在 InnoDB 裏,索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之爲聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之爲非聚簇索引。

7)聚簇索引和非聚簇索引,在查詢數據的時候有區別嗎?

聚簇索引查詢會更快,由於主鍵索引樹的葉子節點直接就是咱們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值之後,還須要再經過主鍵的值再進行一次查詢。

8)主鍵索引查詢只會查一次,而非主鍵索引須要回表查詢屢次(這個過程叫作回表)。是全部狀況都是這樣的嗎?非主鍵索引必定會查詢屢次嗎?

覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就可以取得,沒必要從數據表中讀取。也能夠稱之爲實現了索引覆蓋。當一條查詢語句符合覆蓋索引條件時,MySQL只須要經過索引就能夠返回查詢所須要的數據,這樣避免了查到索引後再返回表操做,減小I
 sql

相關文章
相關標籤/搜索