2021最新Java常用開源庫總結
目錄
- 1.Mysql
- 2.CHAR 與 VARCHAR 的區別?
- 3.能說下myisam 和 innodb的區別嗎?
- 4.你能說下事務的基本特性和隔離級別嗎?
- 5.併發問題 -- 髒讀、不可重複讀、幻讀?
- 6.事務的隔離級別?
- 7.說說自增主鍵、UUID?
- 8.mysql 的約束分類?
- 9.drop、delete 與 truncate 的區別:
- 10.隱式事務、顯式事務?
- 11.儲存過程
- 12.你們資料量級多大?分庫分表怎麼做的?
- 13.那分表後的ID怎麼保證唯一性的呢?
- 14.那分表後的ID怎麼保證唯一性的呢?
- 15.分表後非sharding_key的查詢怎麼處理呢?
- 16.說說mysql主從同步怎麼做的吧?
- 總結
1.Mysql 中有哪幾種鎖?
(1)表級鎖:開銷小,加鎖快。不會出現死鎖,鎖定粒度大,發生鎖衝突的概率高,併發度低。
(2)行級鎖:開銷大,加鎖慢。會出現死鎖,鎖定粒度小,發生鎖衝突的概率低,併發度高。
(3)頁面鎖:開銷時間、加鎖時間、鎖定粒度在 表級鎖 與 行級鎖 之間,會出現死鎖,併發度中等。
2.CHAR 與 VARCHAR 的區別?
(1)CHAR 長度不可變,範圍 1~255。若儲存長度未達到定義的長度,則以 空格 填充。存取速度快,但容易浪費空間。
(2)VARCHAR 長度可變,範圍 1~65535。若儲存長度未達到定義的長度,則存實際長度資料。存取速度稍慢,但節約空間。
3.能說下myisam 和 innodb的區別嗎?
myisam引擎是5.1版本之前的預設引擎,支援全文檢索、壓縮、空間函式等,但是不支援事務和行級鎖,所以一般用於有大量查詢少量插入的場景來使用,而且myisam不支援外來鍵,並且索引和資料是分開儲存的。
innodb是基於聚簇索引建立的,和myisam相反它支援事務、外來鍵,並且通過MVCC來支援高併發,索引和資料儲存在一起。
4.你能說下事務的基本特性和隔離級別嗎?
事務:資料庫中,對資料的一系列操作可以看成一個整體,稱為事務。這個整體要麼全部執行、要麼全部不執行。
ACID 屬性的存在確保了 事務的可靠。
(1)Actomicity(原子性):原子性要求 事務中的操作要麼全部完成,要麼回退成之前未操作的狀態。即事務中某個操作失敗後,會相當於什麼都沒發生,不會出現改了部分資料的情況。
(2)Consistency(一致性):一致性要求 事務執行前後,資料庫的狀態一致,即從一個一致性狀態切換到另一個一致性的狀態。
(3)Isolation(隔離性):隔離性要求 併發的事務相互隔離、不可見。即一個事務看不見另一個事務內部的操作以及操作的資料。
(4)Durability(永續性):永續性要求 事務對資料庫資料的修改是永久的。即資料一旦修改提交後,其狀態將永久不變。
5.併發問題 – 髒讀、不可重複讀、幻讀?
對於同時執行的多個事務,若這些事務訪問同一資料時,沒有采用必要的隔離機制,則會造成如下的併發問題。
(1)髒讀:髒讀 指的是當一個事務正在訪問某資料,並對這個資料進行的修改,且這條資料還未提交到資料庫中,此時若另一個事務也訪問到這條資料,獲取到的是這條被修改的資料,此時得到的資料不對,即髒讀。
比如:tom 年齡為 22,事務 A 修改 tom 年齡為 30,此時還未提交到資料庫,此時事務 B 獲取 tom 年齡,得到的是 30,事務 A 回滾資料,資料庫的資料依舊是 22,但事務 B 拿到的資料是 30,這就是髒讀,讀錯了資料。
(2)不可重複讀:指一個事務,多次讀取同一條資料,在這個事務還未結束時,另一個事務也訪問該資料並對其修改,那麼可能造成事務多次讀取的資料不一致,即不可重複讀。
比如:tom 年齡為 22,事務 A 讀取 tom 年齡為 22,事務未結束。此時事務 B 修改 tom 年齡為 30,並提交到資料庫,當事務 A 再次讀取 tom 年齡為 30,事務 A 兩次讀取的資料不一致,即不可重複讀。
(3)幻讀:指事務並不是獨立執行時產生的現象。一個事務修改某個表,涉及表的所有行,同時另一個事務也修改表,比如增加或刪除一條資料。此時第一個事務發現多出或者少了一條資料。這種情況就是幻讀。
比如:事務 A 查詢當前表的資料總數為 11, 此時事務 B 向表中插入一條資料,事務 A 再次查詢當前表資料總數為 12,即幻讀。
注:
不可重複讀、幻讀理解起來有些類似。
不可重複讀是對一條資料操作,重點在於修改某條資料。
幻讀是對錶進行操作,重點在於新增或刪除某條資料。
6.事務的隔離級別?
資料庫系統必須具有隔離併發執行的事務的能力,使各事務間不會相互影響,避免併發問題。
隔離級別:指的是一個事務與其他事務的隔離程度。隔離級別越高,則併發能力越弱。
(1)Read Uncommitted(讀未提交):即讀取到 未提交的內容。
一般不使用。此隔離級別下,查詢不會加鎖,即可能存在兩個事務操作同一個表的情況。可能會導致 “髒讀”、“不可重複讀”、“幻讀”。
(2)Read Committed(讀提交):即只能讀取到 已提交的內容。
常用(oracle、SQL Server 預設隔離級別)。此隔離級別下,查詢採用 快照讀 的機制,即不會讀取到未提交的資料,從而避免 “髒讀”,但是仍可能導致 “不可重複讀”、“幻讀”。
(3)Repeatable Read(可重複讀)
常用(mysql 預設隔離級別)。此隔離級別下,查詢採用 快照讀 的機制,且事務啟動後,當前資料不能被修改,從而可以避免 “不可重複讀”,但是仍可能導致 “幻讀”(新增或刪除某條資料)。
(4)Serializable(序列化)
一般不使用。此隔離級別下,事務會序列化執行(排隊執行),執行效率差、開銷大。可以避免 “髒讀”、“不可重複讀”、“幻讀“。
【舉例:】
select @@transaction_isolation; -- 用於檢視當前資料庫的隔離級別(8.0版本)
set session transaction isolation level read committed; --用於設定隔離級別為 read committed
7.說說自增主鍵、UUID?
(1)自增主鍵,資料在物理結構上是順序儲存,效能好,佔用空間小。可以是 int 和 bigint 型別。int 4位元組,bigint 8 位元組,專案中理論不應出現 自增主鍵達到最大值的情況,因為資料太大,效率會大大降低,當出現一定的資料量後,應進行分庫分表操作。
(2)UUID,資料在物理結構上是隨機儲存,效能較差,佔用空間大。唯一ID,絕不衝突。
8.mysql 的約束分類?
(1)約束的作用:是一種限制,用於限制表中的資料,為了保證資料的準確性以及可靠性。
(2)約束分類:
NOT NULL,非空,用於保證某個欄位不為空。支援列級約束。
DEFAULT,預設,用於保證某個欄位具有預設值。支援列級約束。
PRIMARY KEY,主鍵,用於保證某個欄位具有唯一性且非空。支援列級約束以及表級約束。
UNIQUE,唯一,用於保證某個欄位具有唯一性。支援列級約束以及表級約束。
FORGIEN KEY,外來鍵,用於限制兩個表間的關係。支援表級約束。
注:
列級約束:指的是定義列的同時指定的約束。
表級約束:指的是列定義之後指定的約束。
外來鍵常用於一對多的關係。即表的某條資料,對應另外一張表的多條資料。
將 “一” 的一方稱為 :主表。將 “多” 的一方稱為 :從表。
通常將 外來鍵 置於從表上,即 從表上增加一列作為外來鍵,並依賴於主表的某列。
最後
手繪了下圖所示的kafka知識大綱流程圖(xmind檔案不能上傳,匯出圖片展現),但都都可提供原始檔給每位愛學習的朋友,**獲取連結:戳這裡免費下載
百度網盤連結:pan.baidu.com/s/1BDrBZ5sv4rzxyDDFLbpocw
提取碼:exa7
**