網易架構師深入講解Java開發!BAT等大廠必問技術面試題

前言

MyBatis是目前非常流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis的架構設計思路,并且討論MyBatis的幾個核心部件,然后結合一個select查詢實例,深入代碼,來探究MyBatis的實現。

20道常見MySQL數據庫面試題+解析

  1. 事務四大特性(ACID)原子性、一致性、隔離性、持久性?

  2. 事務的并發?事務隔離級別,每個級別會引發什么問題,MySQL默認是哪個級別?

  3. MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?

  4. MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?

  5. 查詢語句不同元素(where、jion、limit、group by、having等等)執行先后順序?

  6. 什么是臨時表,臨時表什么時候刪除?

  7. MySQL B+Tree索引和Hash索引的區別?

  8. sql查詢語句確定創建哪種類型的索引?如何優化查詢?

  9. 聚集索引和非聚集索引區別?

  10. 有哪些鎖(樂觀鎖悲觀鎖),select 時怎么加排它鎖?

  11. 非關系型數據庫和關系型數據庫區別,優勢比較?

  12. 數據庫三范式,根據某個場景設計數據表?

  13. 數據庫的讀寫分離、主從復制,主從復制分析的 7 個問題?

  14. 使用explain優化sql和索引?

  15. MySQL慢查詢怎么解決?

  16. 什么是 內連接、外連接、交叉連接、笛卡爾積等?

  17. mysql都有什么鎖,死鎖判定原理和具體場景,死鎖怎么解決?

  18. varchar和char的使用場景?

  19. mysql 高并發環境解決方案?

  20. 數據庫崩潰時事務的恢復機制(REDO日志和UNDO日志)?

1、事務四大特性(ACID)原子性、一致性、隔離性、持久性?

原子性(Atomicity)

  • 原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

一致性(Consistency)

  • 事務開始前和結束后,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到

隔離性(Isolation)

  • 隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離

同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

關于事務的隔離性數據庫提供了多種隔離級別,稍后會介紹到持久性(Durability)

  • 持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作

2、事務的并發?事務隔離級別,每個級別會引發什么問題,MySQL默認是哪個級別?

從理論上來說, 事務應該彼此完全隔離, 以避免并發事務所導致的問題,然而, 那樣會對性能產生極大的影響, 因為事務必須按順序運行, 在實際開發中, 為了提升性能, 事務會以較低的隔離級別運行, 事務的隔離級別可以通過隔離事務屬性指定

2.1事務的并發問題

(1)臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據

(2)不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果因此本事務先后兩次讀到的數據結果會不一致。

(3)幻讀:幻讀解決了不重復讀,保證了同一個事務里,查詢的結果都是事務開始時的狀態(一致性)。

例如:事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”并且提交給數據庫。 而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有跟沒有修改一樣,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。

小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

2.2事務的隔離級別

事務隔離級別

image

  • 讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據臟讀

  • 不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果因此本事務先后兩次讀到的數據結果會不一致。

  • 可重復讀:在同一個事務里,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象

  • 串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。并發的事務,就像事務是在一個個按照順序執行一樣

2.3 MySQL默認的事務隔離級別為repeatable-read

  • MySQL 支持 4 中事務隔離級別.

  • 事務的隔離級別要得到底層數據庫引擎的支持, 而不是應用程序或者框架的支持.

  • Oracle 支持的 2 種事務隔離級別:READ_COMMITED , SERIALIZABLE

2.3補充

  1. SQL規范所規定的標準,不同的數據庫具體的實現可能會有些差異

  2. MySQL中默認事務隔離級別是“可重復讀”時并不會鎖住讀取到的行

  • 事務隔離級別未提交讀時,寫數據只會鎖住相應的行。

  • 事務隔離級別為可重復讀時,寫數據會鎖住整張表。

  • 事務隔離級別為串行化時,讀寫數據都會鎖住整張表。

隔離級別越高越能保證數據的完整性和一致性,但是對并發性能的影響也越大,魚和熊掌不可兼得啊。對于多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed,它能夠避免臟讀取,而且具有較好的并發性能。盡管它會導致不可重復讀、幻讀這些并發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。

image.png

21條MySQL性能調優經驗

  1. 為查詢緩存優化你的查詢

  2. EXPLAIN你的SELECT查詢

  3. 當只要一行數據時使用LIMIT 1

  4. 為搜索字段建索引

  5. 在Join表的時候使用相當類型的例,并將其索引

  6. 千萬不要 ORDER BY RAND()

  7. 避免 SELECT *

  8. 永遠為每張表設置一個 ID

  9. 使用 ENUM 而不是 VARCHAR

  10. 從 PROCEDURE ANALYSE() 取得建議

  11. 盡可能的使用 NOT NULL

  12. Prepared Statements

  13. 無緩沖的查詢

  14. 把 IP 地址存成 UNSIGNED INT

  15. 固定長度的表會更快

  16. 垂直分割

  17. 拆分大的 DELETE 或 INSERT 語句

  18. 越小的列會越快

  19. 選擇正確的存儲引擎

  20. 使用一個對象關系映射器(Object Relational Mapper)

  21. 小心“永久鏈接”

image

總結

上述知識點,囊括了目前互聯網企業的主流應用技術以及能讓你成為“香餑餑”的高級架構知識,每個筆記里面幾乎都帶有實戰內容。

很多人擔心學了容易忘,這里教你一個方法,那就是重復學習。

打個比方,假如你正在學習 spring 注解,突然發現了一個注解@Aspect,不知道干什么用的,你可能會去查看源碼或者通過博客學習,花了半小時終于弄懂了,下次又看到@Aspect 了,你有點郁悶了,上次好像在哪哪哪學習,你快速打開網頁花了五分鐘又學會了。

資料領取方式:戳這里免費領取

從半小時和五分鐘的對比中可以發現多學一次就離真正掌握知識又近了一步。

人的本性就是容易遺忘,只有不斷加深印象、重復學習才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
com/doc/DSmxTbFJ1cmN1R2dB)**

從半小時和五分鐘的對比中可以發現多學一次就離真正掌握知識又近了一步。

[外鏈圖片轉存中…(img-p87JJFjz-1622454425591)]

人的本性就是容易遺忘,只有不斷加深印象、重復學習才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386230.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IOS 消息轉發

最近在看消息轉發的資料&#xff0c;發現大部分都是理論知識&#xff0c;很少有完整的代碼。現在以代碼的形式形象的解釋一下&#xff1a; 用Xcode創建一個工程 1.正常方法調用 創建一個類Person 代碼如下 Person.h代碼如下&#xff1a; #import <Foundation/Foundation.h&g…

網易資深Java架構師:java數組對象轉為list集合

前言 現在刷抖音經常可以看到一些老外街坊&#xff0c;問他們最想把什么帶回自己的國家&#xff0c;我聽過很多的回答都是&#xff1a;淘寶&#xff0c;支付寶&#xff0c;美食&#xff0c;微信&#xff0c;外賣&#xff0c;高鐵等等。 確實如此&#xff0c;隨著國家的快速發…

夯實基礎——P2084 進制轉換

題目鏈接&#xff1a;https://www.luogu.org/problem/P2084 P2084 進制轉換 題目背景 無 題目描述 今天小明學會了進制轉換&#xff0c;比如&#xff08;10101&#xff09;2 &#xff0c;那么它的十進制表示的式子就是 : 1*2^40*2^31*2^20*2^11*2^0&#xff0c; 那么請你編程實…

網易資深Java架構師:java方法的定義和使用

前言 今年因為這個疫情&#xff0c;感覺這是從工作以來過的最久的一個年了&#xff0c;在家呆的時間不是一般的久&#xff0c;算一算有好幾個月呢&#xff01;我大概是3月底快4月了才出門&#xff0c;投了超多的簡歷&#xff0c;天天面試面試面試面試面試面試面試…慶幸的是還…

PHP----學生管理系統

閑來無事花費兩天時間寫了份簡易版的學生管理系統 源碼地址:https://www.cnblogs.com/post/ReadAuth?blogId509327&PostId11333758&url%2Fbyczyz%2Fprotected%2Fp%2F11333758.html 轉載于:https://www.cnblogs.com/byczyz/p/11333760.html

網易資深Java架構師:jdkjrejvm的區別和聯系

前言 作為同時具備高性能、高可靠和高可擴展性的典型鍵值數據庫&#xff0c;Redis不僅功能強大&#xff0c;而且穩定&#xff0c;理所當然地成為了大型互聯網公司的首選。 眾多大廠在招聘的時候&#xff0c;不僅會要求面試者能簡單地使用Redis&#xff0c;還要能深入地理解底…

深度學習之開端備注

Adagrad //適合稀疏樣本 RMSprop//借鑒Adagrad的思想&#xff0c;改進使得不會出現學習率越來越低的問題 由此可見Adadelta既不需要輸入學習率等參數&#xff0c;而且表現得非常好&#xff01;&#xff01;但是我試了幾次&#xff0c;這個優化器效果極差&#xff01;&#xff0…

網易資深Java架構師:疫情對java行業的影響分析

前言 在實際開發&#xff0c;Redis使用會頻繁&#xff0c;那么在使用過程中我們該如何正確抉擇數據類型呢&#xff1f;哪些場景下適用哪些數據類型。而且在面試中也很常會被面試官問到Redis數據結構方面的問題&#xff1a; Redis為什么快呢&#xff1f;為什么查詢操作會變慢了…

ListView與.FindControl()方法的簡單練習 #2 -- ItemUpdting事件中抓取「修改后」的值

原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_20130624.aspx ListView與.FindControl()方法的簡單練習 #2 -- ItemUpdting事件中抓取「修改后」的值 本文跟上一篇文章有關連&#xff0c;請依照順序來練習&#xff1…

美團java研發崗二面:java靜態方法存儲在哪個區

思維導圖 前言 在很多時候&#xff0c;我們都可以在各種框架應用中看到ZooKeeper的身影&#xff0c;比如Kafka中間件&#xff0c;Dubbo框架&#xff0c;Hadoop等等。為什么到處都看到ZooKeeper&#xff1f; 一、 前些年&#xff0c;互聯網行業里對架構師這個崗位的標準還不是…

[學習之道] 修福不修慧,大象披瓔珞; 修慧不修福,羅漢托空缽 (學習寫程序,只靠補習上課嗎?)...

這是我的備份&#xff0c;原文請看 http://www.dotblogs.com.tw/mis2000lab/archive/2014/09/17/learning-and_do-it_20140917.aspx [學習之道] 修福不修慧&#xff0c;大象披瓔珞&#xff1b; 修慧不修福&#xff0c;羅漢托空缽 (學習寫程序&#xff0c;只靠補習上課嗎&#…

阿里P8親自教你!mysql列轉行

前言 今日博主聽聞&#xff0c;現在很多培訓出來的應屆生薪資都趕上了摸爬滾打兩三年的朋友&#xff0c;講道理&#xff0c;這說不過去啊 作為同行來說&#xff0c;這個行業發展很快&#xff0c;技術更新很快&#xff0c;淘汰也很快&#xff0c;千萬不要再找借口了&#xff0…

同步、異步、多線程

1、首先明確一點&#xff0c;對于單核CPU&#xff0c;任意一個時刻只有一個線程在運行。那么既然這樣&#xff0c;多線程還有什么意義呢&#xff1f; 舉例來說&#xff0c;現在只有一個人&#xff0c;要做好幾個任務。單線程就是&#xff0c;任務一個一個地做&#xff0c;必須做…

阿里P8親自教你!熬夜整理華為最新Java筆試題

前言 Mysql的鎖機制確實非常重要&#xff0c;所以在這里做一個全面的總結整理&#xff0c;便于以后的查閱&#xff0c;也分享給大家。 Mysql的鎖機制還是有點難理解的&#xff0c;所以這篇文章采用圖文結合的方式講解難點&#xff0c;幫助大家理解&#xff0c;講解的主要內容…

JSP基礎筆記

/** #####這部分也是筆記,用于記錄JSP的相關內容* ###怎么用JSP###指令的寫法* <% 指令名字%>* *### page指令 * language > 表明jsp頁面中可以寫java代碼 * contentType > 其實即使說這個文件是什么類型&#xff0c;告訴瀏覽器我是什么內容類型&#xff0c;以及使…

阿里P8親自講解!javawhile循環語句用法

前言 作為一個已經畢業的計算機專業學長&#xff0c;其實幾年大學走來還是挺感慨萬千的。&#xff08;說明一下&#xff1a;一本&#xff0c;非958、211&#xff09; 老實說&#xff0c;上大學之前填志愿選專業的時候沒有任何打算&#xff0c;就覺得學海熬到頭了&#xff0c;向…

Cookie,Session基礎知識

//這部分主要是CookieSession的筆記部分/** //獲取來訪的客戶端類型String clientTyereq.getHeader("User-Agent");//如果是火狐瀏覽器&#xff0c;那么使用以下代碼if(clientTye.contains("Firefox")){fileNameDownLoadUtil.base64EncodeFileName(fileNam…

阿里P8親自講解!java中級開發工程師需要掌握的技能

前言 關于技術人如何成長的問題&#xff0c;一直以來都備受關注&#xff0c;因為程序員職業發展很快&#xff0c;即使是相同起點的人&#xff0c;經過幾年的工作或學習&#xff0c;會迅速拉開極大的差距&#xff0c;所以技術人保持學習&#xff0c;提升自己&#xff0c;才能夠…

隨筆--互聯網進化論

不聞不若聞之&#xff1b;有的人士的理論引起了轟動&#xff0c;吾等小網民也來學學&#xff0c;沒那么大腦袋&#xff0c;從不敢談解讀與批判。聞香而來&#xff0c;放屁而去。比如說互聯網進化論。看看實踐&#xff0c;互聯網的膨脹式發展是不會停的&#xff0c;在中國的互聯…

阿里P8親自講解!java分布式需要學什么技術

引言 最近項目上線的頻率頗高&#xff0c;連著幾天加班熬夜&#xff0c;身體有點吃不消精神也有些萎靡&#xff0c;無奈業務方催的緊&#xff0c;工期就在眼前只能硬著頭皮上了。腦子渾渾噩噩的時候&#xff0c;寫的就不能叫代碼&#xff0c;可以直接叫做Bug。我就熬夜寫了一個…