用什么做視頻網站百度網址收錄提交入口
目錄
前言
1.事務的特性是什么?可以詳細說一下嗎?
2.并發(fā)事務帶來哪些問題?怎么解決這些問題呢?Mysql的默認隔離級別是?
3.undo log和redo log的區(qū)別。
4.事務中的隔離性是如何保證的(解釋一下MVCC)?
5.主從同步原理。
6.項目用過分庫分表嗎?
總結
前言
本文主要介紹了Mysql事務面試題相關的面試題目。
1.事務的特性是什么?可以詳細說一下嗎?
- 原子性(Atomicity): 事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。
- 一致性(Consistency) :事務完成時,必須使所有的數據都保持一致狀態(tài)。
- 隔離性(Isolation):數據庫系統(tǒng)提供的隔離機制,保證事務在不受外部并發(fā)操作影響的獨立環(huán)境下運行。
- 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。
參考回答:ACID,分別指的是:原子性、一致性、隔離性、持久性。舉個例子:A向B轉賬500,轉賬成功,A扣除500元,B增加500元,原子操作體現(xiàn)在要么都成功,要么都失敗。在轉賬的過程中,數據要一致,A扣除了500,B必須增加500。在轉賬的過程中,隔離性體現(xiàn)在A向B轉賬,不能受其他事務干擾。在轉賬的過程中,持久性體現(xiàn)在事務提交后,要把數據持久化(可以說是落盤操作)。
2.并發(fā)事務帶來哪些問題?怎么解決這些問題呢?Mysql的默認隔離級別是?
并發(fā)事務的問題:
- 臟讀:一個事務讀到另外一個事務還沒有提交的數據。
- 不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同。
- 幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發(fā)現(xiàn)這行數據已經存在,好像出現(xiàn)了”幻影”。
隔離級別和問題:
- Read uncommitted ? 未提交讀 ? ? ? ? ? 臟讀、不可重復讀、幻讀
- Read committed ?讀已提交 ? ? ? ? ? ? ? ? 不可重復讀、幻讀
- Repeatable read ?可重復讀 ? ? ? ? ? ? ? ? ?幻讀
- Serializable ? 串行化
參考回答:
? ? ? ?在項目開發(fā)中,多個事務并發(fā)進行是經常發(fā)生的,并發(fā)也是必然的,有可能導致一些問題:第一是臟讀,當一個事務正在訪問數據并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時另外一個事務也訪問了這個數據,因為這個數據是還沒有提交的數據,那么另外一個事務讀到的這個數據是”臟數據”,依據”臟數據”所做的操作可能是不正確的;第二是不可重復讀,比如在一個事務內多次讀同一數據,在這個事務還沒有結束時,另一個事務也訪問該數據,那么在第一個事務中的兩次讀數據之間,由于第二個事務的修改導致第一個事務兩次談取的數據可能不太一樣,這就發(fā)生了在一個事務內兩次讀到的數據是不一樣的情況,因此稱為不可重復讀;第三是幻讀,幻讀與不可重復讀類似,它發(fā)生在一個事務(T1) 讀取了幾行數據接著另一個并發(fā)事務(T2)插入了一些數據時,在隨后的查詢中,第一個事務(T1)就會發(fā)現(xiàn)多了些原本不存在的記錄,就好像發(fā)生了幻覺一樣,所以稱為幻讀。
? ? ? ? 解決這些問題的解決方案是對事務進行隔離,Mysql支持四種隔離級別,分別有:第一個是未提交讀,它解決不了剛才提出的所有問題,一般項目中也不用這個;第二個是讀已提交,它能解決臟讀的問題的,但是解決不了不可重復讀和幻讀;第三個是可重復讀,它能解決臟讀和不可重復讀,但是解決不了幻讀,這個也是Mysql默認的隔離級別;第四個是串行化,它可以解決剛才提出來的所有問題,但是由于讓是事務串行執(zhí)行的,性能比較低。所以我們一般使用的都是Mysql默認的隔離級別:可重復讀。
3.undo log和redo log的區(qū)別。
- redo log:記錄的是數據頁的物理變化,服務宕機可用來同步數據。
- undo log:記錄的是邏輯日志,當事務回滾時,通過逆操作恢復原來的數據。
- redo log保證了事務的持久性,undo log保證了事務的原子性和一致性。
參考回答:其中redo log日志記錄的是數據頁的物理變化,服務宕機可用來同步數據,而undo log不同,它主要記錄的是邏輯日志,當事務回滾時,通過逆操作恢復原來的數據,比如我們刪除一條數據的時候,就會在undo log日志文件中新增一條delete語句,如果發(fā)生回滾就執(zhí)行逆操作。redo log保證了事務的持久性,undo log保證了事務的原子性和一致性。
4.事務中的隔離性是如何保證的(解釋一下MVCC)?
Mysql中的多版本并發(fā)控制,指維護一個數據的多個版本,使得讀寫操作沒有沖突。
隱藏字段:
- trx_id(事務id),記錄每一次操作的事務id,是自增的。
- roll_pointer(回滾指針),指向上一個版本的事務版本記錄地址。
undo log:
- 回滾日志,存儲老版本數據。
- 版本鏈:多個事務并行操作某一行記錄,記錄不同事務修改數據的版本,通過roll_pointer指針形成一個鏈表
readView解決的是一個事務查詢選擇版本的問題:
- 根據readView的匹配規(guī)則和當前的一些事務id判斷該訪問那個版本的數據。
- 不同的隔離級別快照讀是不一樣的,最終的訪問的結果不一樣。
- RC:每一次執(zhí)行快照讀時生成ReadView。
- RR:僅在事務中第一次執(zhí)行快照讀時生成ReadView,后續(xù)復用。
參考回答:事務的隔離性是由鎖和mvcc實現(xiàn)的。其中mvcc的意思是多版本并發(fā)控制。指維護一個數據的多個版本,使得讀寫操作沒有沖突,它的底層實現(xiàn)主要是分為了三個部分,第一個是隱藏字段,第二個是undo log日志,第三個是readView讀視圖。隱藏字段是指:在Mysql中給每個表都設置了隱藏字段,有一個是trx_id(事務id),記錄每一次操作的事務id,是自增的;另一個字段是roll_pointer(回滾指針),指向上一個版本的事務版本記錄地址。undo log主要的作用是記錄回滾日志,存儲老版本數據,在內部會形成一個版本鏈,在多個事務并行操作某一行記錄,記錄不同事務修改數據的版本,通過roll_pointer指針形成一個鏈表。readView解決的是一個事務查詢選擇版本的問題,在內部定義了一些匹配規(guī)則和當前的一些事務id判斷該訪問那個版本的數據,不同的隔離級別快照讀是不一樣的,最終的訪問的結果不一樣。如果是rc隔離級別,每一次執(zhí)行快照讀時生成ReadView,如果是rr隔離級別僅在事務中第一次執(zhí)行快照讀時生成ReadView,后續(xù)復用。
5.主從同步原理。
Mysql主從復制的核心就是二進制日志binlog(DDL(數據定義語言)語句和 DML(數據操縱語言)語句)。
- 主庫在事務提交時,會把數據變更記錄在二進制日志文件 Binlog 中。
- 從庫讀取主庫的二進制日志文件 Binlog,寫入到從庫的中繼日志 Relay Log。
- 從庫重做中繼日志中的事件,將改變反映它自己的數據。
參考回答:Mysql主從復制的核心就是二進制日志,二進制日志記錄了所有的DDL語句和DML語句。具體的主從同步過程大概的流程是這樣的:
- Master 主庫在事務提交時,會把數據變更記錄在二進制日志文件 Binlog 中。
- 從庫讀取主庫的二進制日志文件 Binlog,寫入到從庫的中繼日志 Relay Log。
- slave重做中繼日志中的事件,將改變反映它自己的數據。
6.項目用過分庫分表嗎?
業(yè)務介紹:
- 根據自己簡歷上的項目,想一個數據量較大的業(yè)務(請求數多或業(yè)務累積大)。
- 達到了什么樣的量級(單表1000萬或超過20G)。
具體拆分策略:
- 水平分庫,將一個庫的數據拆分到多個庫中,解決海量數據存儲和高并發(fā)的問題(sharding-sphere、mycat)。
- 水平分表,解決單表存儲和性能的問題(sharding-sphere、mycat)。
- 垂直分庫,根據業(yè)務進行拆分,高并發(fā)下提高磁盤IO和網絡連接數。
- 垂直分表,冷熱數據分離,多表互不影響。
總結
本文主要介紹了Mysql事務面試題相關的面試題目。