(高頻問題)121-140 計(jì)算機(jī) Java后端 實(shí)習(xí) and 秋招 面試高頻問題匯總
121. 分庫分表中的數(shù)據(jù)定位策略詳解
在分庫分表架構(gòu)中,數(shù)據(jù)定位算法是核心環(huán)節(jié),它決定了數(shù)據(jù)如何有效地分布到不同的數(shù)據(jù)庫實(shí)例或表中。選擇合適的定位策略對(duì)系統(tǒng)的性能、可擴(kuò)展性和維護(hù)性至關(guān)重要。
常用的數(shù)據(jù)定位策略包括哈希取模。這是一種簡單且常見的方法,通常選擇業(yè)務(wù)主鍵或關(guān)鍵字段作為分片鍵,通過哈希函數(shù)計(jì)算其哈希值,再對(duì)分片(庫或表)的總數(shù)取模,根據(jù)余數(shù)確定數(shù)據(jù)應(yīng)存儲(chǔ)的分片。該策略實(shí)現(xiàn)簡單,能較好地實(shí)現(xiàn)數(shù)據(jù)均勻分布。然而,其主要缺點(diǎn)在于當(dāng)分片總數(shù)發(fā)生變化(擴(kuò)容或縮容)時(shí),會(huì)導(dǎo)致大規(guī)模數(shù)據(jù)遷移,對(duì)系統(tǒng)穩(wěn)定性造成沖擊。
范圍分區(qū)是另一種策略,它根據(jù)分片鍵的值范圍來劃分?jǐn)?shù)據(jù)。系統(tǒng)預(yù)先設(shè)定好每個(gè)分片負(fù)責(zé)存儲(chǔ)的分片鍵值區(qū)間,數(shù)據(jù)寫入時(shí)根據(jù)其分片鍵的值直接路由到對(duì)應(yīng)的分片。這種方式邏輯清晰,易于管理,尤其適合處理具有明顯范圍特征的數(shù)據(jù),如時(shí)間序列數(shù)據(jù)。但其缺點(diǎn)是可能導(dǎo)致數(shù)據(jù)分布不均和熱點(diǎn)問題,因?yàn)椴煌秶鷥?nèi)的數(shù)據(jù)量可能差異巨大。
為了克服哈希取模在擴(kuò)縮容時(shí)的局限性,一致性哈希算法應(yīng)運(yùn)而生。它將整個(gè)哈希值空間想象成一個(gè)虛擬圓環(huán),并將每個(gè)分片節(jié)點(diǎn)映射到環(huán)上的某個(gè)位置。數(shù)據(jù)的存儲(chǔ)位置由其分片鍵的哈希值決定,沿順時(shí)針方向找到的第一個(gè)節(jié)點(diǎn)即為其存儲(chǔ)目標(biāo)。這種設(shè)計(jì)的最大優(yōu)點(diǎn)是,當(dāng)增加或移除節(jié)點(diǎn)時(shí),僅影響環(huán)上相鄰節(jié)點(diǎn)的部分?jǐn)?shù)據(jù),極大減少了數(shù)據(jù)遷移量。為了進(jìn)一步提高數(shù)據(jù)分布的均勻性,通常會(huì)引入虛擬節(jié)點(diǎn)的概念,即一個(gè)物理節(jié)點(diǎn)映射為環(huán)上的多個(gè)虛擬節(jié)點(diǎn)。一致性哈希雖然提高了系統(tǒng)的動(dòng)態(tài)擴(kuò)展能力,但實(shí)現(xiàn)相對(duì)復(fù)雜。
此外,還可以根據(jù)具體的業(yè)務(wù)場景設(shè)計(jì)自定義的定位算法。例如,結(jié)合用戶地理位置、業(yè)務(wù)類型等維度進(jìn)行數(shù)據(jù)劃分。這種方式能高度貼合業(yè)務(wù)需求,解決特定場景下的數(shù)據(jù)分布與訪問挑戰(zhàn),但需要投入額外的開發(fā)和維護(hù)成本。
在實(shí)踐中,選擇哪種定位算法需權(quán)衡數(shù)據(jù)分布均勻性、系統(tǒng)擴(kuò)展性需求及實(shí)現(xiàn)復(fù)雜度。對(duì)于需要頻繁擴(kuò)縮容的動(dòng)態(tài)系統(tǒng),一致性哈希是優(yōu)選方案。對(duì)于數(shù)據(jù)訪問模式相對(duì)固定(如按時(shí)間范圍查詢),范圍分區(qū)可能更合適。有時(shí)也會(huì)結(jié)合使用多種策略,例如先用一致性哈希確定數(shù)據(jù)庫實(shí)例,再在庫內(nèi)使用范圍分區(qū)或哈希取模進(jìn)行表級(jí)別的分片。
122. 使用Set統(tǒng)計(jì)UV的優(yōu)勢及大規(guī)模場景下的替代方案
在統(tǒng)計(jì)獨(dú)立訪客(UV, Unique Visitors)數(shù)量時(shí),采用集合(Set)數(shù)據(jù)結(jié)構(gòu)而非簡單的計(jì)數(shù)器,主要是因?yàn)樗芴烊坏乇WC元素的唯一性,這對(duì)于精確統(tǒng)計(jì)不重復(fù)的訪客至關(guān)重要。
使用Set統(tǒng)計(jì)UV的核心優(yōu)勢在于其自動(dòng)去重特性。當(dāng)嘗試向Set中添加一個(gè)已存在的元素(如用戶ID)時(shí),Set結(jié)構(gòu)會(huì)自動(dòng)忽略重復(fù)添加,確保每個(gè)獨(dú)立訪客只被記錄一次。相比之下,若直接使用計(jì)數(shù)器,每次訪問都會(huì)遞增計(jì)數(shù)值,無法區(qū)分新訪客與重復(fù)訪問的老訪客,導(dǎo)致統(tǒng)計(jì)結(jié)果偏高。同時(shí),Set的使用簡化了編程邏輯,開發(fā)者無需手動(dòng)編寫檢查訪客是否已存在的代碼?,F(xiàn)代編程語言中Set的實(shí)現(xiàn)(通常基于哈希表)在添加和查找操作上具有較高的效率,能夠快速處理大量數(shù)據(jù),避免了直接計(jì)數(shù)方案中潛在的性能瓶頸。此外,維護(hù)一個(gè)包含所有獨(dú)立訪客標(biāo)識(shí)的Set,不僅能得到UV總數(shù),還能為后續(xù)更深入的用戶行為分析(如留存分析、路徑分析等)提供基礎(chǔ)數(shù)據(jù)。
然而,當(dāng)面臨極大規(guī)模的數(shù)據(jù)量時(shí),直接在內(nèi)存中維護(hù)一個(gè)包含所有用戶ID的Set可能會(huì)消耗巨大的內(nèi)存資源,成為系統(tǒng)瓶頸。在這種情況下,需要考慮更節(jié)省空間的替代方案。其中,HyperLogLog(HLL)是一種廣泛應(yīng)用的概率數(shù)據(jù)結(jié)構(gòu)。它可以用極小的內(nèi)存空間(通常只需幾KB)來估算一個(gè)龐大數(shù)據(jù)集中唯一元素的數(shù)量(基數(shù)),其誤差率通??梢钥刂圃谳^低水平(如1%左右),對(duì)于許多業(yè)務(wù)場景而言,這種近似值已經(jīng)足夠滿足需求。HLL不僅空間效率高,其計(jì)算和更新操作也非??欤ㄍǔ镺(1)),并且支持合并操作,非常適合在分布式環(huán)境下并行計(jì)算各分片的UV后進(jìn)行匯總。除了HLL,還可以采用數(shù)據(jù)分片、將訪客記錄持久化后通過離線批處理或?qū)崟r(shí)流處理進(jìn)行計(jì)算等策略來應(yīng)對(duì)大規(guī)模UV統(tǒng)計(jì)的挑戰(zhàn)。
123. MyISAM存儲(chǔ)引擎的適用場景分析
MyISAM曾是MySQL數(shù)據(jù)庫在5.5版本之前的默認(rèn)存儲(chǔ)引擎。它以其簡單的設(shè)計(jì)和較快的執(zhí)行速度為特點(diǎn),但也存在明顯局限,最主要的是它不支持事務(wù)(Transactions)和行級(jí)鎖(Row-level locking),且在系統(tǒng)崩潰或斷電時(shí)存在較高的數(shù)據(jù)損壞風(fēng)險(xiǎn)。因此,是否選用MyISAM需要根據(jù)應(yīng)用的具體需求來判斷。
MyISAM特別適合讀密集型應(yīng)用場景。由于其鎖定機(jī)制相對(duì)簡單(主要是表級(jí)鎖),在大量執(zhí)行SELECT查詢操作而更新(INSERT、UPDATE、DELETE)較少的應(yīng)用中,MyISAM通常能提供較高的讀取性能。
其次,對(duì)于不需要事務(wù)支持的應(yīng)用,MyISAM是一個(gè)可選項(xiàng)。如果業(yè)務(wù)邏輯不涉及必須保證原子性、一致性、隔離性和持久性(ACID)的操作,例如簡單的內(nèi)容發(fā)布系統(tǒng)、日志記錄或者報(bào)表生成等場景,MyISAM的簡潔性可能更具優(yōu)勢。
在資源受限的環(huán)境下,MyISAM也可能被考慮。通常情況下,MyISAM表比InnoDB表占用更少的磁盤空間和內(nèi)存資源。
此外,MyISAM historically 提供了強(qiáng)大的全文索引(FULLTEXT)功能,對(duì)于需要進(jìn)行文本內(nèi)容全文搜索的應(yīng)用,MyISAM曾是首選。盡管后來的InnoDB版本(MySQL 5.6及以后)也加入了對(duì)全文索引的支持,但在一些遺留系統(tǒng)或特定配置下,MyISAM的全文索引可能仍被沿用。
總結(jié)來說,MyISAM主要適用于對(duì)數(shù)據(jù)一致性要求不高、讀操作遠(yuǎn)多于寫操作、不需要事務(wù)支持,并且可以接受其并發(fā)性能和數(shù)據(jù)安全性限制的特定場景。在現(xiàn)代應(yīng)用開發(fā)中,由于InnoDB提供了事務(wù)支持、行級(jí)鎖、更好的崩潰恢復(fù)能力和更高的并發(fā)性能,已成為絕大多數(shù)場景下的首選存儲(chǔ)引擎。
124. 操作系統(tǒng)中的邏輯地址到物理地址轉(zhuǎn)換機(jī)制
操作系統(tǒng)中的內(nèi)存管理核心功能之一是將程序使用的邏輯地址(或稱虛擬地址)轉(zhuǎn)換為實(shí)際內(nèi)存中的物理地址。這一轉(zhuǎn)換機(jī)制使得每個(gè)進(jìn)程擁有獨(dú)立、連續(xù)且看似巨大的地址空間,簡化了編程模型,同時(shí)提高了內(nèi)存利用率和系統(tǒng)安全性。實(shí)現(xiàn)地址轉(zhuǎn)換主要依賴以下幾種技術(shù):
分段(Segmentation)是一種內(nèi)存管理方式,它將進(jìn)程的地址空間劃分為多個(gè)邏輯段(如代碼段、數(shù)據(jù)段、堆棧段等)。邏輯地址由兩部分構(gòu)成:段號(hào)和段內(nèi)偏移量。轉(zhuǎn)換時(shí),操作系統(tǒng)通過查詢?cè)撨M(jìn)程的段表,利用段號(hào)找到對(duì)應(yīng)段的物理基地址和長度信息。然后,將段內(nèi)偏移量與基地址相加,得到最終的物理地址。同時(shí),會(huì)檢查偏移量是否超出了段的長度限制,以保證訪問的合法性。
分頁(Paging)是目前更主流的內(nèi)存管理技術(shù)。它將邏輯地址空間和物理內(nèi)存都劃分為固定大小的塊,分別稱為頁(Page)和頁框(Page Frame)。邏輯地址同樣由兩部分組成:頁號(hào)和頁內(nèi)偏移量。轉(zhuǎn)換時(shí),操作系統(tǒng)利用頁號(hào)查詢進(jìn)程的頁表,找到該邏輯頁對(duì)應(yīng)的物理頁框號(hào)。物理頁框號(hào)與頁內(nèi)偏移量組合(通常是將頁框號(hào)乘以頁大小再加上偏移量),形成最終的物理地址。
許多現(xiàn)代系統(tǒng)采用了分段與分頁相結(jié)合的策略,邏輯地址先經(jīng)過分段機(jī)制轉(zhuǎn)換成一個(gè)線性地址,然后這個(gè)線性地址再通過分頁機(jī)制最終轉(zhuǎn)換為物理地址。
為了加速地址轉(zhuǎn)換過程,避免每次轉(zhuǎn)換都訪問內(nèi)存中的段表或頁表(這會(huì)顯著降低性能),現(xiàn)代CPU普遍內(nèi)置了轉(zhuǎn)換后援緩沖(Translation Lookaside Buffer, TLB)。TLB是一個(gè)高速緩存,存儲(chǔ)了近期使用過的頁表?xiàng)l目(即邏輯頁號(hào)到物理頁框號(hào)的映射關(guān)系)。進(jìn)行地址轉(zhuǎn)換時(shí),系統(tǒng)首先檢查TLB。如果命中(即所需映射在TLB中),則直接獲取物理地址,無需訪問內(nèi)存中的頁表,大大提高了轉(zhuǎn)換速度。如果未命中,則需要查詢內(nèi)存中的頁表,并將查詢結(jié)果存入TLB以備后續(xù)使用。
125. Spring Boot注解識(shí)別與處理機(jī)制解析
Spring Boot 大量利用注解來簡化配置和開發(fā),其底層識(shí)別與處理注解的機(jī)制是建立在 Spring 框架核心功能和 Java 注解特性之上的。
首先,Spring Boot 應(yīng)用在啟動(dòng)時(shí),會(huì)執(zhí)行組件掃描(Component Scanning)。這通常由啟動(dòng)類上的 @SpringBootApplication 注解(其內(nèi)部包含了 @ComponentScan)觸發(fā)。Spring 容器會(huì)掃描指定包(默認(rèn)為啟動(dòng)類所在包及其子包)下的所有類。
在掃描過程中,Spring 會(huì)檢查類、方法或字段上是否存在特定的 Spring 注解。這些注解本身是 Java 語言的一種元數(shù)據(jù)(Metadata)形式,通過 @interface 關(guān)鍵字定義。注解自身并不直接執(zhí)行代碼,但它們攜帶了信息,可以被其他程序讀取和處理。Java 注解通過 @Retention 注解指定其保留策略,對(duì)于 Spring 而言,RetentionPolicy.RUNTIME 最為關(guān)鍵,因?yàn)樗试S在程序運(yùn)行時(shí)通過反射(Reflection)讀取注解信息。@Target 則限定了注解可以應(yīng)用于哪些程序元素(如類、方法、字段等)。
當(dāng) Spring 發(fā)現(xiàn)帶有特定注解的元素時(shí),它會(huì)根據(jù)注解的類型執(zhí)行相應(yīng)的處理邏輯。例如:
- 發(fā)現(xiàn)帶有 @Component 或其衍生注解(如 @Service, @Repository, @Controller)的類時(shí),Spring 會(huì)將其實(shí)例化并注冊(cè)為容器中的 Bean。
- 遇到 @Autowired 注解時(shí),Spring 會(huì)嘗試自動(dòng)注入所需的依賴 Bean。
- @Configuration 標(biāo)識(shí)的類和其中帶有 @Bean 注解的方法用于定義和配置 Bean。
- @EnableAutoConfiguration 注解(也是 @SpringBootApplication 的一部分)則指示 Spring Boot 根據(jù)項(xiàng)目 classpath 中的依賴和已定義的 Bean,嘗試自動(dòng)配置應(yīng)用程序,極大地簡化了常見框架的集成。
注解之所以能改變或增強(qiáng)程序行為,是因?yàn)榇嬖谔幚磉@些注解的代碼。在 Spring 中,這通常發(fā)生在運(yùn)行時(shí),通過 Java 的反射 API 讀取注解及其屬性值,然后執(zhí)行相應(yīng)的配置或代理邏輯。例如,Spring AOP(面向切面編程)可以查找?guī)в刑囟ㄗ⒔猓ㄈ缡聞?wù)注解 @Transactional 或自定義注解)的方法,并在這些方法執(zhí)行前后織入額外的邏輯(如事務(wù)管理、日志記錄、權(quán)限檢查等),而無需修改原始方法代碼。這種基于注解的元數(shù)據(jù)驅(qū)動(dòng)方式,結(jié)合框架的運(yùn)行時(shí)處理能力,是 Spring Boot 實(shí)現(xiàn)“約定優(yōu)于配置”和簡化開發(fā)的關(guān)鍵。
126. Spring Boot/MVC 過濾器(Filter)與攔截器(Interceptor)的對(duì)比分析
在 Spring Boot 和 Spring MVC 應(yīng)用中,過濾器(Filter)和攔截器(Interceptor)都常用于對(duì) Web 請(qǐng)求進(jìn)行預(yù)處理和后處理,但它們?cè)趤碓?、作用范圍、?zhí)行時(shí)機(jī)和能力上存在顯著差異。
過濾器是基于 Java Servlet API 的規(guī)范,屬于 Servlet 容器層面的組件。它在請(qǐng)求實(shí)際進(jìn)入 Servlet(對(duì)于 Spring MVC 來說是 DispatcherServlet)之前以及響應(yīng)離開 Servlet 之后執(zhí)行。因此,過濾器可以攔截幾乎所有到達(dá)服務(wù)器的請(qǐng)求,不局限于 Spring 管理的請(qǐng)求,并且能夠直接操作原始的 HttpServletRequest 和 HttpServletResponse 對(duì)象。過濾器的實(shí)現(xiàn)通?;诨卣{(diào)機(jī)制,通過實(shí)現(xiàn) javax.servlet.Filter 接口并重寫 doFilter 方法來嵌入處理邏輯。
攔截器則是 Spring MVC 框架提供的特性,基于 Spring AOP(面向切面編程)思想實(shí)現(xiàn),工作在 DispatcherServlet 內(nèi)部,處理 Controller 請(qǐng)求的特定階段(如 Controller 方法執(zhí)行前、執(zhí)行后、視圖渲染后)。這意味著攔截器僅對(duì)經(jīng)過 Spring DispatcherServlet 處理的請(qǐng)求有效,并且可以訪問 Spring 的上下文,包括 獲取和使用 IoC 容器中管理的 Bean。攔截器的實(shí)現(xiàn)通常通過實(shí)現(xiàn) HandlerInterceptor 接口或繼承 HandlerInterceptorAdapter 類。
在執(zhí)行時(shí)機(jī)上,過濾器鏈的執(zhí)行早于攔截器鏈。一個(gè)請(qǐng)求首先經(jīng)過匹配的過濾器鏈,然后進(jìn)入 DispatcherServlet,再由 DispatcherServlet 調(diào)度執(zhí)行相應(yīng)的攔截器鏈和 Controller 方法。由于攔截器在 Spring 框架內(nèi)執(zhí)行,它可以獲取到請(qǐng)求對(duì)應(yīng)的處理器(Controller)和處理方法等更豐富的信息,但通常不直接修改請(qǐng)求體本身,更多用于權(quán)限檢查、日志記錄、性能監(jiān)控等場景。
兩者都支持鏈?zhǔn)秸{(diào)用,可以配置多個(gè)過濾器或攔截器按指定順序執(zhí)行。在異常處理方面,攔截器提供了更靈活的機(jī)制,例如 afterCompletion 方法無論請(qǐng)求處理過程中是否發(fā)生異常都會(huì)執(zhí)行,適合進(jìn)行資源清理等操作。而過濾器鏈中某個(gè)過濾器拋出異常,通常會(huì)中斷后續(xù)過濾器和 Servlet 的執(zhí)行。
127. Java中靜態(tài)方法與私有方法的“重寫”辨析:隱藏與不可訪問性
在 Java 語言中,重寫(Override)是面向?qū)ο蠖鄳B(tài)性的核心機(jī)制之一,允許子類提供一個(gè)與其父類中某個(gè)方法具有相同簽名(方法名、參數(shù)列表)的特定實(shí)現(xiàn)。然而,并非所有方法都能被重寫。
靜態(tài)方法(Static Methods)不能被重寫。靜態(tài)方法是與類本身關(guān)聯(lián),而非類的實(shí)例。如果在子類中定義了一個(gè)與父類同名且同參數(shù)列表的靜態(tài)方法,這并不會(huì)覆蓋父類的實(shí)現(xiàn),而是構(gòu)成了方法隱藏(Hiding)。調(diào)用哪個(gè)靜態(tài)方法完全取決于編譯時(shí)引用的類型是父類還是子類,而不是運(yùn)行時(shí)對(duì)象的實(shí)際類型,因此不具備多態(tài)行為。
私有方法(Private Methods)同樣不能被重寫。私有方法的作用域被嚴(yán)格限制在其定義的類內(nèi)部,對(duì)于子類來說是不可見的。因此,子類無法訪問父類的私有方法,自然也就無法對(duì)其進(jìn)行重寫。若在子類中定義了一個(gè)與父類私有方法同名同參數(shù)的方法,它僅僅是子類中一個(gè)全新的、獨(dú)立的方法,與父類的私有方法沒有任何關(guān)聯(lián)。
真正的重寫僅適用于子類可以繼承的實(shí)例方法(即非 static、非 final、非 private,且具有足夠訪問權(quán)限的方法,如 public 或 protected)。通過重寫,子類可以改變繼承來的行為,實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)。
128. MongoDB核心架構(gòu):索引機(jī)制、復(fù)制集與分片集群詳解
MongoDB 作為一個(gè)高性能的 NoSQL 數(shù)據(jù)庫,其強(qiáng)大的數(shù)據(jù)處理能力部分歸功于其靈活的索引機(jī)制和可擴(kuò)展的集群架構(gòu)。
MongoDB 的默認(rèn)索引類型基于 B+樹(B-Tree 的一種優(yōu)化變體),這種數(shù)據(jù)結(jié)構(gòu)特別適合磁盤存儲(chǔ),能夠高效地支持點(diǎn)查詢、范圍查詢以及排序操作。除了默認(rèn)的單字段索引,MongoDB 還支持多種索引類型以優(yōu)化不同查詢場景,關(guān)鍵類型包括:復(fù)合索引(多字段組合)、地理空間索引(處理地理位置數(shù)據(jù))、全文索引(用于文本搜索)、唯一索引(保證字段值的唯一性)、哈希索引(支持基于哈希的等值查詢,常用于分片鍵)以及稀疏索引等。合理創(chuàng)建和使用索引是 MongoDB 性能優(yōu)化的關(guān)鍵。
為了保證數(shù)據(jù)的高可用性和可靠性,MongoDB 提供了復(fù)制集(Replica Set)。一個(gè)復(fù)制集由多個(gè) MongoDB 實(shí)例(節(jié)點(diǎn))組成,其中一個(gè)是主節(jié)點(diǎn)(Primary),其余為從節(jié)點(diǎn)(Secondary)。所有寫操作都必須發(fā)送到主節(jié)點(diǎn)執(zhí)行,然后操作日志(oplog)會(huì)被異步復(fù)制到所有從節(jié)點(diǎn)。讀操作默認(rèn)也路由到主節(jié)點(diǎn),但可以配置為從從節(jié)點(diǎn)讀?。ㄗx寫分離),以分?jǐn)傋x負(fù)載。復(fù)制集的核心優(yōu)勢在于自動(dòng)故障轉(zhuǎn)移:當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),剩余的從節(jié)點(diǎn)會(huì)自動(dòng)選舉出一個(gè)新的主節(jié)點(diǎn),保證服務(wù)的持續(xù)可用,對(duì)應(yīng)用層透明。
當(dāng)單一復(fù)制集無法滿足海量數(shù)據(jù)存儲(chǔ)或高并發(fā)讀寫需求時(shí),MongoDB 采用分片集群(Sharded Cluster)來實(shí)現(xiàn)水平擴(kuò)展。分片集群將數(shù)據(jù)分散存儲(chǔ)在多個(gè)分片(Shard)上,每個(gè)分片通常是一個(gè)獨(dú)立的復(fù)制集以確保自身高可用。集群主要由三個(gè)組件構(gòu)成:分片(Shards)負(fù)責(zé)存儲(chǔ)數(shù)據(jù)的子集;查詢路由器(mongos)作為請(qǐng)求入口,負(fù)責(zé)將客戶端請(qǐng)求路由到正確的分片;配置服務(wù)器(Config Servers)存儲(chǔ)集群的元數(shù)據(jù),包括數(shù)據(jù)在各分片上的分布信息(由分片鍵 Shard Key決定)。通過分片,MongoDB 可以線性擴(kuò)展存儲(chǔ)容量和吞吐量。
129. MongoDB事務(wù)機(jī)制與ACID特性支持分析
是的,MongoDB 從 4.0 版本開始支持多文檔事務(wù),并在 4.2 版本中將其擴(kuò)展到支持分布式事務(wù)(跨分片事務(wù))。這意味著 MongoDB 可以在單個(gè)事務(wù)中執(zhí)行涉及多個(gè)文檔、多個(gè)集合甚至多個(gè)分片的一系列讀寫操作,并保證這些操作滿足 ACID 屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
具體來說:
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
曾獲多國內(nèi)大廠的 ssp 秋招 offer,且是Java5年的沉淀老兵(不是)。專注后端高頻面試與八股知識(shí)點(diǎn),內(nèi)容系統(tǒng)詳實(shí),覆蓋約 30 萬字面試真題解析、近 400 個(gè)熱點(diǎn)問題(包含大量場景題),60 萬字后端核心知識(shí)(含計(jì)網(wǎng)、操作系統(tǒng)、數(shù)據(jù)庫、性能調(diào)優(yōu)等)。同時(shí)提供簡歷優(yōu)化、HR 問題應(yīng)對(duì)、自我介紹等通用能力。考慮到歷史格式混亂、質(zhì)量較低、也在本地積累了大量資料,故準(zhǔn)備從頭重構(gòu)專欄全部內(nèi)容