网易架构师深入讲解Java开发!BAT等大厂必问技术面试题
前言
MyBatis是目前非常流行的ORM框架,它的功能很強(qiáng)大,然而其實(shí)現(xiàn)卻比較簡單、優(yōu)雅。本文主要講述MyBatis的架構(gòu)設(shè)計(jì)思路,并且討論MyBatis的幾個核心部件,然后結(jié)合一個select查詢實(shí)例,深入代碼,來探究MyBatis的實(shí)現(xiàn)。
20道常見MySQL數(shù)據(jù)庫面試題+解析
事務(wù)四大特性(ACID)原子性、一致性、隔離性、持久性?
事務(wù)的并發(fā)?事務(wù)隔離級別,每個級別會引發(fā)什么問題,MySQL默認(rèn)是哪個級別?
MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區(qū)別?
MySQL的MyISAM與InnoDB兩種存儲引擎在,事務(wù)、鎖級別,各自的適用場景?
查詢語句不同元素(where、jion、limit、group by、having等等)執(zhí)行先后順序?
什么是臨時表,臨時表什么時候刪除?
MySQL B+Tree索引和Hash索引的區(qū)別?
sql查詢語句確定創(chuàng)建哪種類型的索引?如何優(yōu)化查詢?
聚集索引和非聚集索引區(qū)別?
有哪些鎖(樂觀鎖悲觀鎖),select 時怎么加排它鎖?
非關(guān)系型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫區(qū)別,優(yōu)勢比較?
數(shù)據(jù)庫三范式,根據(jù)某個場景設(shè)計(jì)數(shù)據(jù)表?
數(shù)據(jù)庫的讀寫分離、主從復(fù)制,主從復(fù)制分析的 7 個問題?
使用explain優(yōu)化sql和索引?
MySQL慢查詢怎么解決?
什么是 內(nèi)連接、外連接、交叉連接、笛卡爾積等?
mysql都有什么鎖,死鎖判定原理和具體場景,死鎖怎么解決?
varchar和char的使用場景?
mysql 高并發(fā)環(huán)境解決方案?
數(shù)據(jù)庫崩潰時事務(wù)的恢復(fù)機(jī)制(REDO日志和UNDO日志)?
1、事務(wù)四大特性(ACID)原子性、一致性、隔離性、持久性?
原子性(Atomicity)
- 原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。
一致性(Consistency)
- 事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞。比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到。
隔離性(Isolation)
- 隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。
同一時間,只允許一個事務(wù)請求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。
關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別,稍后會介紹到。 持久性(Durability)
- 持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
2、事務(wù)的并發(fā)?事務(wù)隔離級別,每個級別會引發(fā)什么問題,MySQL默認(rèn)是哪個級別?
從理論上來說, 事務(wù)應(yīng)該彼此完全隔離, 以避免并發(fā)事務(wù)所導(dǎo)致的問題,然而, 那樣會對性能產(chǎn)生極大的影響, 因?yàn)槭聞?wù)必須按順序運(yùn)行, 在實(shí)際開發(fā)中, 為了提升性能, 事務(wù)會以較低的隔離級別運(yùn)行, 事務(wù)的隔離級別可以通過隔離事務(wù)屬性指定。
2.1事務(wù)的并發(fā)問題
(1)臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
(2)不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果因此本事務(wù)先后兩次讀到的數(shù)據(jù)結(jié)果會不一致。
(3)幻讀:幻讀解決了不重復(fù)讀,保證了同一個事務(wù)里,查詢的結(jié)果都是事務(wù)開始時的狀態(tài)(一致性)。
例如:事務(wù)T1對一個表中所有的行的某個數(shù)據(jù)項(xiàng)做了從“1”修改為“2”的操作 這時事務(wù)T2又對這個表中插入了一行數(shù)據(jù)項(xiàng),而這個數(shù)據(jù)項(xiàng)的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。 而操作事務(wù)T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有跟沒有修改一樣,其實(shí)這行是從事務(wù)T2中添加的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。
小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
2.2事務(wù)的隔離級別
事務(wù)隔離級別
-
讀未提交:另一個事務(wù)修改了數(shù)據(jù),但尚未提交,而本事務(wù)中的SELECT會讀到這些未被提交的數(shù)據(jù)臟讀
-
不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果因此本事務(wù)先后兩次讀到的數(shù)據(jù)結(jié)果會不一致。
-
可重復(fù)讀:在同一個事務(wù)里,SELECT的結(jié)果是事務(wù)開始時時間點(diǎn)的狀態(tài),因此,同樣的SELECT操作讀到的結(jié)果會是一致的。但是,會有幻讀現(xiàn)象
-
串行化:最高的隔離級別,在這個隔離級別下,不會產(chǎn)生任何異常。并發(fā)的事務(wù),就像事務(wù)是在一個個按照順序執(zhí)行一樣
2.3 MySQL默認(rèn)的事務(wù)隔離級別為repeatable-read
-
MySQL 支持 4 中事務(wù)隔離級別.
-
事務(wù)的隔離級別要得到底層數(shù)據(jù)庫引擎的支持, 而不是應(yīng)用程序或者框架的支持.
-
Oracle 支持的 2 種事務(wù)隔離級別:READ_COMMITED , SERIALIZABLE
2.3補(bǔ)充
SQL規(guī)范所規(guī)定的標(biāo)準(zhǔn),不同的數(shù)據(jù)庫具體的實(shí)現(xiàn)可能會有些差異
MySQL中默認(rèn)事務(wù)隔離級別是“可重復(fù)讀”時并不會鎖住讀取到的行
-
事務(wù)隔離級別:未提交讀時,寫數(shù)據(jù)只會鎖住相應(yīng)的行。
-
事務(wù)隔離級別為:可重復(fù)讀時,寫數(shù)據(jù)會鎖住整張表。
-
事務(wù)隔離級別為:串行化時,讀寫數(shù)據(jù)都會鎖住整張表。
隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大,魚和熊掌不可兼得啊。對于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設(shè)為Read Committed,它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會導(dǎo)致不可重復(fù)讀、幻讀這些并發(fā)問題,在可能出現(xiàn)這類問題的個別場合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。
21條MySQL性能調(diào)優(yōu)經(jīng)驗(yàn)
為查詢緩存優(yōu)化你的查詢
EXPLAIN你的SELECT查詢
當(dāng)只要一行數(shù)據(jù)時使用LIMIT 1
為搜索字段建索引
在Join表的時候使用相當(dāng)類型的例,并將其索引
千萬不要 ORDER BY RAND()
避免 SELECT *
永遠(yuǎn)為每張表設(shè)置一個 ID
使用 ENUM 而不是 VARCHAR
從 PROCEDURE ANALYSE() 取得建議
盡可能的使用 NOT NULL
Prepared Statements
無緩沖的查詢
把 IP 地址存成 UNSIGNED INT
固定長度的表會更快
垂直分割
拆分大的 DELETE 或 INSERT 語句
越小的列會越快
選擇正確的存儲引擎
使用一個對象關(guān)系映射器(Object Relational Mapper)
小心“永久鏈接”
總結(jié)
上述知識點(diǎn),囊括了目前互聯(lián)網(wǎng)企業(yè)的主流應(yīng)用技術(shù)以及能讓你成為“香餑餑”的高級架構(gòu)知識,每個筆記里面幾乎都帶有實(shí)戰(zhàn)內(nèi)容。
很多人擔(dān)心學(xué)了容易忘,這里教你一個方法,那就是重復(fù)學(xué)習(xí)。
打個比方,假如你正在學(xué)習(xí) spring 注解,突然發(fā)現(xiàn)了一個注解@Aspect,不知道干什么用的,你可能會去查看源碼或者通過博客學(xué)習(xí),花了半小時終于弄懂了,下次又看到@Aspect 了,你有點(diǎn)郁悶了,上次好像在哪哪哪學(xué)習(xí),你快速打開網(wǎng)頁花了五分鐘又學(xué)會了。
資料領(lǐng)取方式:戳這里免費(fèi)領(lǐng)取
從半小時和五分鐘的對比中可以發(fā)現(xiàn)多學(xué)一次就離真正掌握知識又近了一步。
人的本性就是容易遺忘,只有不斷加深印象、重復(fù)學(xué)習(xí)才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
com/doc/DSmxTbFJ1cmN1R2dB)**
從半小時和五分鐘的對比中可以發(fā)現(xiàn)多學(xué)一次就離真正掌握知識又近了一步。
[外鏈圖片轉(zhuǎn)存中…(img-p87JJFjz-1622454425591)]
人的本性就是容易遺忘,只有不斷加深印象、重復(fù)學(xué)習(xí)才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
總結(jié)
以上是生活随笔為你收集整理的网易架构师深入讲解Java开发!BAT等大厂必问技术面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟打人机选了一个英雄点确定的时候l
- 下一篇: 创维电视开机后蓝屏如何回事?