目錄
12.事務的特性是什么?可以詳細說一下嗎?
回答
13并發事務帶來哪些問題?怎么解決這些問題呢?MySQL的默認隔離級別是?
臟讀:一個事務讀到另外一個事務還沒有提交的數據。
不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀。
幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現已經存在,好像出現了”幻影”。幻讀是在解決不可重復讀的基礎上
?編輯
怎么解決并發事務的問題呢?
?編輯
回答
15.undo log和redo log的區別
redo log
undo log
回答
16.事務中的隔離性是如何保證的呢?
回答
17.解釋一下MVCC
17.1記錄中的隱藏字段
17.2undo log
17.3readview
17.3.1當前讀
17.3.2快照讀
回答
18.MySQL主從同步原理
回答
19.你們項目用過分庫分表嗎
19.1拆分策略
19.1.1垂直拆分
19.1.2水平拆分
19.1.3分庫分表的策略有哪些
回答
12.事務的特性是什么?可以詳細說一下嗎?
事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。
ACID是什么?可以詳細說一下嗎?
- 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。
- 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態。
- 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行。
- 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。
回答
- 原子性( Atomicity )
- 一致性( Consistency )
- 隔離性( Isolation )
- 持久性( Durability )
13并發事務帶來哪些問題?怎么解決這些問題呢?MySQL的默認隔離級別是?
并發事務問題:臟讀、不可重復讀、幻讀
隔離級別:讀未提交、讀已提交、可重復讀、串行化
問題 | 描述 |
臟讀 | 一個事務讀到另外一個事務還沒有提交的數據。 |
不可重復讀 | 一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀。 |
幻讀 | 一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現已經存在,好像出現了”幻影”。 |
臟讀:一個事務讀到另外一個事務還沒有提交的數據。
不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀。
幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現已經存在,好像出現了”幻影”。幻讀是在解決不可重復讀的基礎上
怎么解決并發事務的問題呢?
解決方案:對事物進行隔離
回答
并發事務的問題:
- 臟讀:一個事務讀到另外一個事務還沒有提交的數據。
- 不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同
- 幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了”幻影”。
隔離級別:
- READ UNCOMMITTED ?未提交讀? ? ?------臟讀、不可重復讀、幻讀(解決不了的)
- READ COMMITTED ?讀已提交? ? ? ? ? ------不可重復讀、幻讀(解決不了的)
- REPEATABLE READ ?可重復讀? ? ? ? ?-------幻讀(解決不了的)
- SERIALIZABLE ? ?
- 串行化
15.undo log和redo log的區別
緩沖池(buffer pool):主內存中的一個區域,里面可以緩存磁盤上經常操作的真實數據,在執行增刪改查操作時,先操作緩沖池中的數據(若緩沖池沒有數據,則從磁盤加載并緩存),以一定頻率刷新到磁盤,從而減少磁盤IO,加快處理速度
數據頁(page):是InnoDB 存儲引擎磁盤管理的最小單元,每個頁的大小默認為 16KB。頁中存儲的是行數據
磁盤結構中主要存儲的就是數據頁,當我們操作數據的時候,并不會直接操作磁盤,首先先操作內存(緩沖池),看看有沒有需要操作的數據,沒有的話,就會從磁盤中把數據加載到內存中,操作完成后,會按照一定的頻率再把數據同步到磁盤中,就可以減少磁盤的io,加快處理的速度
redo log
重做日志,記錄的是事務提交時數據頁的物理修改,是用來實現事務的持久性。
該日志文件由兩部分組成:重做日志緩沖(redo log buffer)以及重做日志文件(redo log file),前者是在內存中,后者在磁盤中。當事務提交之后會把所有修改信息都存到該日志文件中, 用于在刷新臟頁到磁盤,發生錯誤時, 進行數據恢復使用。
當有增刪改查的時候,現在BufferPool中發生改變,RedoLogBuffer就會記錄數據頁的變化,一但RedoLogBuffer發生變化,就會同步加載到磁盤文件中RedoLogFile中,如果對當頁數據同步失敗了,就會從RedoLogFile恢復數據
刷新當頁數據的到磁盤的加入發生了錯誤,就可以使用Redo Log來進行數據的恢復
undo log
回滾日志,用于記錄數據被修改前的信息 , 作用包含兩個 : 提供回滾 和 MVCC(多版本并發控制) 。undo log和redo log記錄物理日志不一樣,它是邏輯日志。
- 可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,
- 當update一條記錄時,它記錄一條對應相反的update記錄。當執行rollback時,就可以從undo log中的邏輯記錄讀取到相應的內容并進行回滾。
undo log可以實現事務的一致性和原子性
回答
redo log: 記錄的是數據頁的物理變化,服務宕機可用來同步數據
undo log :記錄的是邏輯日志,當事務回滾時,通過逆操作恢復原來的數據
redo log保證了事務的持久性,undo log保證了事務的原子性和一致性
16.事務中的隔離性是如何保證的呢?
回答
鎖:排他鎖(如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖)
mvcc : 多版本并發控制?
17.解釋一下MVCC
全稱 Multi-Version Concurrency Control,多版本并發控制。指維護一個數據的多個版本,使得讀寫操作沒有沖突
MVCC的具體實現,主要依賴于數據庫記錄中的隱式字段、undo log日志、readView。
17.1記錄中的隱藏字段
隱藏字段 | 含義 |
DB_TRX_ID | 最近修改事務ID,記錄插入這條記錄或最后一次修改該記錄的事務ID。 |
DB_ROLL_PTR | 回滾指針,指向這條記錄的上一個版本,用于配合undo?log,指向上一個版本。 |
DB_ROW_ID | 隱藏主鍵,如果表結構沒有指定主鍵,將會生成該隱藏字段。 |
17.2undo log
回滾日志,在insert、update、delete的時候產生的便于數據回滾的日志。
當insert的時候,產生的undo log日志只在回滾時需要,在事務提交后,可被立即刪除。
而update、delete的時候,產生的undo log日志不僅在回滾時需要,mvcc版本訪問也需要,不會立即被刪除。
17.3readview
ReadView(讀視圖是快照讀 SQL執行時MVCC提取數據的依據,記錄并維護系統當前活躍的事務(未提交的)id
17.3.1當前讀
讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。對于我們日常的操作,如:
select...lock in share mode(共享鎖),select...for update、update、insert、delete(排他鎖)都是一種當前讀。
17.3.2快照讀
簡單的select(不加鎖)就是快照讀,快照讀,讀取的是記錄數據的可見版本,有可能是歷史數據,不加鎖,是非阻塞讀。
- Read Committed:每次select,都生成一個快照讀。
- Repeatable Read:開啟事務后第一個select語句才是快照讀的地方。
ReadView中包含了四個核心字段:
字段 | 含義 |
m_ids | 當前活躍的事務ID集合 |
min_trx_id | 最小活躍事務ID |
max_trx_id | 預分配事務ID,當前最大事務ID+1(因為事務ID是自增的) |
creator_trx_id | ReadView創建者的事務ID |
不同的隔離級別,生成ReadView的時機不同:
READ COMMITTED :在事務中每一次執行快照讀時生成ReadView。
REPEATABLE READ:僅在事務中第一次執行快照讀時生成ReadView,后續復用該ReadView。
回答
MySQL中的多版本并發控制。指維護一個數據的多個版本,使得讀寫操作沒有沖突
1.隱藏字段:
- trx_id(事務id),記錄每一次操作的事務id,是自增的
- roll_pointer(回滾指針),指向上一個版本的事務版本記錄地址
2.undo log:
- 回滾日志,存儲老版本數據
- 版本鏈:多個事務并行操作某一行記錄,記錄不同事務修改數據的版本,通過roll_pointer指針形成一個鏈表
3.readView解決的是一個事務查詢選擇版本的問題
- 根據readView的匹配規則和當前的一些事務id判斷該訪問那個版本的數據
- 不同的隔離級別快照讀是不一樣的,最終的訪問的結果不一樣 ? ? RC :每一次執行快照讀時生成ReadView ? ? RR:僅在事務中第一次執行快照讀時生成ReadView,后續復用
18.MySQL主從同步原理
MySQL主從復制的核心就是二進制日志
二進制日志(BINLOG)記錄了所有的 DDL(數據定義語言)語句和 DML(數據操縱語言)語句,但不包括數據查詢(SELECT、SHOW)語句。
回答
MySQL主從復制的核心就是二進制日志binlog(DDL(數據定義語言)語句和 DML(數據操縱語言)語句)
- 主庫在事務提交時,會把數據變更記錄在二進制日志文件 Binlog 中。
- 從庫讀取主庫的二進制日志文件 Binlog ,寫入到從庫的中繼日志 Relay Log 。
- 從庫重做中繼日志中的事件,將改變反映它自己的數據
19.你們項目用過分庫分表嗎
分擔訪問壓力
解決存儲壓力
分庫分表的時機:
1,前提,項目業務數據逐漸增多,或業務發展比較迅速
2,優化已解決不了性能問題(主從讀寫分離、查詢索引…)
3,IO瓶頸(磁盤IO、網絡IO)、CPU瓶頸(聚合查詢、連接數太多)
19.1拆分策略
19.1.1垂直拆分
垂直分庫
以表為依據,根據業務將不同表拆分到不同庫中。
特點: 1.按業務對數據分級管理、維護、監控、擴展
????????????2.在高并發下,提高磁盤IO和數據量連接數
垂直分表
垂直分表:以字段為依據,根據字段屬性將不同字段拆分到不同表中。
特點: 1,冷熱數據分離
????????????2,減少IO過渡爭搶,兩表互不影響
19.1.2水平拆分
水平分庫
路由規則:1.根據id節點取模
????????????????2.按id也就是范圍路由,節點1(1-100萬 ),節點2(100萬-200萬)
????????????????3.…
水平分庫:將一個庫的數據拆分到多個庫中。
特點:1. 解決了單庫大數量,高并發的性能瓶頸問題
???????????2.提高了系統的穩定性和可用性
水平分表
水平分表:將一個表的數據拆分到多個表中(可以在同一個庫內)。
特點:1.優化單一表數據量過大而產生的性能問題;
???????????2.避免IO爭搶并減少鎖表的幾率;
19.1.3分庫分表的策略有哪些
新的問題和新的技術
- 分庫之后的問題:
- 分布式事務一致性問題
- 跨節點關聯查詢
- 跨節點分頁、排序函數
- 主鍵避重
分庫分表中間件:
- sharding-sphere
- mycat
回答
業務介紹:
1,根據自己簡歷上的項目,想一個數據量較大業務(請求數多或業務累積大)
具體拆分策略:
1,水平分庫,將一個庫的數據拆分到多個庫中,解決海量數據存儲和高并發的問題?
2,水平分表,解決單表存儲和性能的問題
3,垂直分庫,根據業務進行拆分,高并發下提高磁盤IO和網絡連接數----微服務一般用的多
4,垂直分表,冷熱數據分離,多表互不影響2----用的也多
注意:水平分庫,水平分表要使用中間件:sharding-sphere、mycat