更新時間:2022-12-29 15:32:46 來源:動力節點 瀏覽2827次
1.事務的四大特征:
答: 我了解事務的四大特征,他們分別是原子性,一致性,隔離性,持久性。
原子性:
一系列sql語句要么執行,要么不執行,是不可分割的,不能執行一部分。
一致性:
定義是:要么是完全執行的狀態,要么是完全不執行的狀態。,我個人的理解是:一致性是說的業務層面的,例如銀 行轉賬業務,一張卡減掉200元,另一張卡必須增加200元,不存在此消不彼長的情況。
隔離性:
1:一個事務在執行過程中其他的事務是不可見的。
2:一個事務在修改一個數據的時候另外一個事務不允許對這個數據進行修改。晚的事務會阻塞狀態,等第一個事務執 行完,第二個事務解阻塞。
持久性:
一旦事務提交數據就保存在數據庫中,持久保存。
2.臟讀,幻讀,不可重復讀:
臟讀:讀到沒有提交的數據。
案例:A事務讀取B事務尚未提交的數據,此時如果B事務發生錯誤并執行回滾操作,那么A事務讀取到的數據就是臟數據。
不可重復讀:讀到兩個不一樣的數據。(指的是數據內容)
案例:A先讀取數據為100,此時B事務修改該數據為200,然后提交。A再次讀取數據為200。這種情況就是不可重復讀。
幻讀:讀到兩個不一樣的數據集。(指的是整體的數據集)
案例:A先讀取數據集一共100條數據,此時B事務增加了200條數據,然后提交。A再次讀取數據,發現數據集變成了300條。這種情況就是幻讀。
3.事務的隔離級別:
答:事務的隔離級別有四種:從高到底分別是:串行化(serializable), 可重復讀(Repeatable-Read), 讀已提交(Read-Commited),讀未提交(Read-Uncommited),Mysql默認的隔離級別是:可重復讀(Repeatable-Read),而SQLServer,Oracle默認的事務的隔離級別是:讀已提交(Read-Commited)。
串行化:A事務結束之后,B事務才能開始。
可重復讀:事務開啟后,讀取的數據永遠是開啟事務時的狀態。
讀已提交:一個事務要等另一個事務提交后才能讀取數據。
讀未提交:一個事務能夠讀取到另一個事務沒有提交的數據。
4.讀未提交解決:臟寫問題:
它的本質就是一個事務將另一個事務提交的修改操作回滾了
首先是事務 A 將數據的值修改為 data1,暫時不提交事務;
然后事務 B 將數據的值修改為 data2,然后立馬提交事務;
事務 A 可能由于自己的業務系統出現了異常,因此進行回滾操作,將數據的值重新回滾為 data。
解決方案: 加寫鎖。要對數據修改,必須要先獲取到這行數據的寫鎖,否則不能修改。
而我們的讀未提交就解決了臟寫的問題。因為讀未提交是不允許寫的,只能讀。在該隔離級別下,能保證事務提交之前,其他事務不能同時對這條數據進行修改。
5.讀已提交解決:臟讀問題:
臟讀,只是在讀未提交的狀態下發生的。在讀未提交狀態下,因為這個狀態下能夠讀到另外一個事務沒有提交的數據。
案例:
事務 A 和事務 B 同時執行,事務 A 先將數據從 data 修改為 data1,然后暫時不提交事務。
然后事務 B 讀取這一行數據,讀取到值為 data1,此時事務A進行回滾,則事務B讀到的就是臟數據。
為了解決這個臟讀的問題,數據庫設計了讀已提交的隔離級別。在讀數據的時候,只能讀到別的事務提交過后的值,對于未提交的事務對數據所做的修改操作,當前事務是無法讀取到的。
在讀提交的事務隔離級別下,當事務 B 去讀取數據時,發現事務 A 還沒有提交,因此它不能讀取到 data1 這個值,只能讀取到 data 這個值。
6.可重復讀隔離級別解決:不可重復讀問題:
不可重復讀問題:
案例:(假設在讀以提交隔離級別下)
事務 A 和事務 B 同時開啟事務,事務 A 先從數據庫查詢數據,讀取到的值為 data,然后事務 A 先不提交事務。
接著事務 B 修改數據,將數據的值從 data 修改為 data1。然后提交事務,事務A再次查詢數據,得到的是data1。
此時A兩次讀取的數據不一致?這就是不可重復讀。
為了解決這個不可重復讀的問題:數據庫設計了可重復讀的隔離級別。
它的意思是,在同一個事務內,例如事務 A,多次從數據庫讀取數據時,每次讀取到的值是一樣的,即使在此期間有其他事務修改了這條數據的值,也不會導致事務 A 前后兩次讀取到的值不一樣。
7.MyISAM索引與InnoDB索引的區別?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主鍵索引的葉子節點存儲著行數據,因此主鍵索引非常高效。
MyISAM索引的葉子節點存儲的是行數據地址,需要再尋址一次才能得到數據。
InnoDB支持外鍵,而MyISAM不支持。
InnoDB支持事務,MyISAM不支持。
Innodb不支持全文索引,而MyISAM支持全文索引。
InnoDB支持表、行(默認)級鎖,而MyISAM支持表級鎖。
8.索引的建立有哪些原則嗎?
經常查詢,不同意改,重復值比較少。
聯合索引的最左原則。mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
以上就是“mysql優化面試題,經典收藏版”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習