更新時間:2022-12-29 15:32:46 來源:動力節(jié)點 瀏覽3323次
1.事務(wù)的四大特征:
答: 我了解事務(wù)的四大特征,他們分別是原子性,一致性,隔離性,持久性。
原子性:
一系列sql語句要么執(zhí)行,要么不執(zhí)行,是不可分割的,不能執(zhí)行一部分。
一致性:
定義是:要么是完全執(zhí)行的狀態(tài),要么是完全不執(zhí)行的狀態(tài)。,我個人的理解是:一致性是說的業(yè)務(wù)層面的,例如銀 行轉(zhuǎn)賬業(yè)務(wù),一張卡減掉200元,另一張卡必須增加200元,不存在此消不彼長的情況。
隔離性:
1:一個事務(wù)在執(zhí)行過程中其他的事務(wù)是不可見的。
2:一個事務(wù)在修改一個數(shù)據(jù)的時候另外一個事務(wù)不允許對這個數(shù)據(jù)進行修改。晚的事務(wù)會阻塞狀態(tài),等第一個事務(wù)執(zhí) 行完,第二個事務(wù)解阻塞。
持久性:
一旦事務(wù)提交數(shù)據(jù)就保存在數(shù)據(jù)庫中,持久保存。
2.臟讀,幻讀,不可重復(fù)讀:
臟讀:讀到?jīng)]有提交的數(shù)據(jù)。
案例:A事務(wù)讀取B事務(wù)尚未提交的數(shù)據(jù),此時如果B事務(wù)發(fā)生錯誤并執(zhí)行回滾操作,那么A事務(wù)讀取到的數(shù)據(jù)就是臟數(shù)據(jù)。
不可重復(fù)讀:讀到兩個不一樣的數(shù)據(jù)。(指的是數(shù)據(jù)內(nèi)容)
案例:A先讀取數(shù)據(jù)為100,此時B事務(wù)修改該數(shù)據(jù)為200,然后提交。A再次讀取數(shù)據(jù)為200。這種情況就是不可重復(fù)讀。
幻讀:讀到兩個不一樣的數(shù)據(jù)集。(指的是整體的數(shù)據(jù)集)
案例:A先讀取數(shù)據(jù)集一共100條數(shù)據(jù),此時B事務(wù)增加了200條數(shù)據(jù),然后提交。A再次讀取數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)集變成了300條。這種情況就是幻讀。
3.事務(wù)的隔離級別:
答:事務(wù)的隔離級別有四種:從高到底分別是:串行化(serializable), 可重復(fù)讀(Repeatable-Read), 讀已提交(Read-Commited),讀未提交(Read-Uncommited),Mysql默認的隔離級別是:可重復(fù)讀(Repeatable-Read),而SQLServer,Oracle默認的事務(wù)的隔離級別是:讀已提交(Read-Commited)。
串行化:A事務(wù)結(jié)束之后,B事務(wù)才能開始。
可重復(fù)讀:事務(wù)開啟后,讀取的數(shù)據(jù)永遠是開啟事務(wù)時的狀態(tài)。
讀已提交:一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)。
讀未提交:一個事務(wù)能夠讀取到另一個事務(wù)沒有提交的數(shù)據(jù)。
4.讀未提交解決:臟寫問題:
它的本質(zhì)就是一個事務(wù)將另一個事務(wù)提交的修改操作回滾了
首先是事務(wù) A 將數(shù)據(jù)的值修改為 data1,暫時不提交事務(wù);
然后事務(wù) B 將數(shù)據(jù)的值修改為 data2,然后立馬提交事務(wù);
事務(wù) A 可能由于自己的業(yè)務(wù)系統(tǒng)出現(xiàn)了異常,因此進行回滾操作,將數(shù)據(jù)的值重新回滾為 data。
解決方案: 加寫鎖。要對數(shù)據(jù)修改,必須要先獲取到這行數(shù)據(jù)的寫鎖,否則不能修改。
而我們的讀未提交就解決了臟寫的問題。因為讀未提交是不允許寫的,只能讀。在該隔離級別下,能保證事務(wù)提交之前,其他事務(wù)不能同時對這條數(shù)據(jù)進行修改。
5.讀已提交解決:臟讀問題:
臟讀,只是在讀未提交的狀態(tài)下發(fā)生的。在讀未提交狀態(tài)下,因為這個狀態(tài)下能夠讀到另外一個事務(wù)沒有提交的數(shù)據(jù)。
案例:
事務(wù) A 和事務(wù) B 同時執(zhí)行,事務(wù) A 先將數(shù)據(jù)從 data 修改為 data1,然后暫時不提交事務(wù)。
然后事務(wù) B 讀取這一行數(shù)據(jù),讀取到值為 data1,此時事務(wù)A進行回滾,則事務(wù)B讀到的就是臟數(shù)據(jù)。
為了解決這個臟讀的問題,數(shù)據(jù)庫設(shè)計了讀已提交的隔離級別。在讀數(shù)據(jù)的時候,只能讀到別的事務(wù)提交過后的值,對于未提交的事務(wù)對數(shù)據(jù)所做的修改操作,當前事務(wù)是無法讀取到的。
在讀提交的事務(wù)隔離級別下,當事務(wù) B 去讀取數(shù)據(jù)時,發(fā)現(xiàn)事務(wù) A 還沒有提交,因此它不能讀取到 data1 這個值,只能讀取到 data 這個值。
6.可重復(fù)讀隔離級別解決:不可重復(fù)讀問題:
不可重復(fù)讀問題:
案例:(假設(shè)在讀以提交隔離級別下)
事務(wù) A 和事務(wù) B 同時開啟事務(wù),事務(wù) A 先從數(shù)據(jù)庫查詢數(shù)據(jù),讀取到的值為 data,然后事務(wù) A 先不提交事務(wù)。
接著事務(wù) B 修改數(shù)據(jù),將數(shù)據(jù)的值從 data 修改為 data1。然后提交事務(wù),事務(wù)A再次查詢數(shù)據(jù),得到的是data1。
此時A兩次讀取的數(shù)據(jù)不一致?這就是不可重復(fù)讀。
為了解決這個不可重復(fù)讀的問題:數(shù)據(jù)庫設(shè)計了可重復(fù)讀的隔離級別。
它的意思是,在同一個事務(wù)內(nèi),例如事務(wù) A,多次從數(shù)據(jù)庫讀取數(shù)據(jù)時,每次讀取到的值是一樣的,即使在此期間有其他事務(wù)修改了這條數(shù)據(jù)的值,也不會導(dǎo)致事務(wù) A 前后兩次讀取到的值不一樣。
7.MyISAM索引與InnoDB索引的區(qū)別?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主鍵索引的葉子節(jié)點存儲著行數(shù)據(jù),因此主鍵索引非常高效。
MyISAM索引的葉子節(jié)點存儲的是行數(shù)據(jù)地址,需要再尋址一次才能得到數(shù)據(jù)。
InnoDB支持外鍵,而MyISAM不支持。
InnoDB支持事務(wù),MyISAM不支持。
Innodb不支持全文索引,而MyISAM支持全文索引。
InnoDB支持表、行(默認)級鎖,而MyISAM支持表級鎖。
8.索引的建立有哪些原則嗎?
經(jīng)常查詢,不同意改,重復(fù)值比較少。
聯(lián)合索引的最左原則。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的順序可以任意調(diào)整。
以上就是“mysql優(yōu)化面試題,經(jīng)典收藏版”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點Java官網(wǎng)。
相關(guān)閱讀