MySQL 核心知識點梳理(5)

目錄

事務

MySQL事務的四大特性

ACID

原子性

持久性

隔離性

事務的隔離級別

讀未提交

讀已提交

可重復讀

串行化

事務的隔離級別如何實現

MVCC

版本鏈

READVIEW

高可用

MySQL數據庫的讀寫分離

主從復制

主從同步延遲怎么處理

分庫策略

水平分庫分表的策略


事務

MySQL事務的四大特性

事務是一條或多條 SQL 語句組成的執行單元。四個特性分別是原子性、一致性、隔離性和持久性。原子性保證事務中的操作要么全部執行、要么全部失敗;一致性保證數據從事務開始前的一個一致狀態轉移到結束后的另外一個一致狀態;隔離性保證并發事務之間互不干擾;持久性保證事務提交后數據不會丟失。

ACID

就是事務的四大特性

原子性

ACID 中的原子性主要通過 Undo Log 來實現,持久性通過 Redo Log 來實現,隔離性由 MVCC 和鎖機制來實現,一致性則由其他三大特性共同保證。

事務對數據進行修改前,會記錄一份快照到 Undo Log,如果事務中有任何一步執行失敗,系統會讀取 Undo Log 將所有操作回滾,恢復到事務開始前的狀態,從而保證事務要么全部成功,要么全部失敗。

持久性

MySQL 的持久性主要由預寫 Redo Log、雙寫機制、兩階段提交以及 Checkpoint 刷盤機制共同保證。

當事務提交時,MySQL 會先將事務的修改操作寫入 Redo Log,并強制刷盤,然后再將內存中的數據頁刷入磁盤。這樣即使系統崩潰,重啟后也能通過 Redo Log 重放恢復數據。

隔離性

主要通過鎖機制和 MVCC 來實現。

比如說一個事務正在修改某條數據時,MySQL 會通過臨鍵鎖來防止其他事務同時進行修改,避免數據沖突

MySQL默認事務自動提交

事務的隔離級別

MySQL 支持四種隔離級別,分別是:讀未提交、讀已提交、可重復讀和串行化。

讀未提交

事務可以讀取其他未提交事務修改的數據。也就是說,如果未提交的事務一旦回滾,讀取到的數據就會變成了“臟數據”,通常不會使用。

讀已提交

讀已提交避免了臟讀,但可能會出現不可重復讀,即同一事務內多次讀取同一數據結果會不同,因為其他事務提交的修改,對當前事務是可見的。

可重復讀

可重復讀能確保同一事務內多次讀取相同數據的結果一致,即使其他事務已提交修改。

串行化

串行化是最高的隔離級別,通過強制事務串行執行來解決“幻讀”問題。

事務的隔離級別如何實現

讀未提交通過行鎖共享鎖確保一個事務在更新行數據但沒有提交的情況下,其他事務不能更新該行數據,但不會阻止臟讀,意味著事務2 可以在事務1 提交之前讀取到事務1 修改的數據

讀已提交會在更新數據前加行級排他鎖,不允許其他事務寫入或者讀取未提交的數據,也就意味著事務2 不能在事務 1 提交之前讀取到事務1 修改的數據,從而解決臟讀的問題。

可重復讀只在第一次讀操作時生成 ReadView,后續讀操作都會使用這個 ReadView,從而避免不可重復讀的問題。

另外,對于當前讀操作,可重復讀會通過臨鍵鎖來鎖住當前行和前間隙,防止其他事務在這個范圍內插入數據,從而避免幻讀的問題。

MVCC

多版本并發控制

每次修改數據時,都會生成一個新的版本,而不是直接在原有數據上進行修改。并且每個事務只能看到在它開始之前已經提交的數據版本。

其底層實現主要依賴于 Undo Log 和 Read View。

版本鏈

版本鏈是指 InnoDB 中同一條記錄的多個歷史版本,通過 DB_ROLL_PTR 字段將它們像鏈表一樣串起來,用來支持 MVCC 的快照讀。

READVIEW

ReadView 是 InnoDB 為每個事務創建的一份“可見性視圖”,用于判斷在執行快照讀時,哪些數據版本是當前這個事務可以看到的,哪些不能看到。

高可用

MySQL數據庫的讀寫分離

讀寫分離就是把“寫操作”交給主庫處理,“讀操作”分給多個從庫處理,從而提升系統并發性能。

應用層通過中間件(如 MyCat、ShardingSphere)自動路由請求,將 INSERT / UPDATE / DELETE 等寫操作發送給主庫,將 SELECT 查詢操作發送給從庫。

主從復制

MySQL 的主從復制是一種數據同步機制,用于將數據從主數據庫復制到一個或多個從數據庫。

主庫執行事務提交時,將數據變更以事件形式記錄到 Binlog。從庫通過 I/O 線程從主庫的 Binlog 中讀取變更事件,并將這些事件寫入到本地的中繼日志文件中,SQL 線程會實時監控中繼日志的內容,按順序讀取并執行這些事件,從而保證從庫與主庫數據一致。

主從同步延遲怎么處理

主從同步延遲是因為從庫需要先接收 binlog,再執行 SQL 才能同步主庫數據,在高并發寫或網絡抖動時容易出現延遲,導致讀寫不一致。

第一種解決方案:對一致性要求高的查詢(如支付結果查詢)可以直接走主庫。

第二種解決方案:對于非關鍵業務允許短暫數據不一致,可以提示用戶“數據同步中,請稍后刷新”,然后借助異步通知機制替代實時查詢。

第三種解決方案:采用半同步復制,主庫在事務提交時,要等至少一個從庫確認收到 binlog(但不要求執行完成),才算提交成功。

分庫策略

分庫的策略有兩種,第一種是垂直分庫:按照業務模塊將不同的表拆分到不同的庫中,比如說用戶、登錄、權限等表放在用戶庫中,商品、分類、庫存放在商品庫中,優惠券、滿減、秒殺放在活動庫中。

第二種是水平分庫:按照一定的策略將一個表中的數據拆分到多個庫中,比如哈希分片和范圍分片,對用戶 id 進行取模運算或者范圍劃分,將數據分散到不同的庫中。

水平分庫分表的策略

常見的分片策略有三種,范圍分片、Hash 分片和路由分片。

范圍分片是根據某個字段的值范圍進行水平拆分。適用于分片鍵具有連續性的場景

Hash 分片是指通過對分片鍵的值進行哈希取模,將數據均勻分布到多個庫表中,適用于分片鍵具有離散性的場景。

路由分片是通過路由配置來確定數據應該存儲在哪個庫表,適用于分片鍵不規律的場景。

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

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

相關文章

借助AI學習開源代碼git0.7之六write-tree

借助AI學習開源代碼git0.7之六write-tree write-tree.c 的作用是根據當前的索引(cache)內容創建一個樹(tree)對象,并將其寫入Git的對象數據庫。 樹對象代表了項目在某個時間點的目錄結構。 代碼的主要邏輯:…

開源 python 應用 開發(八)圖片比對

最近有個項目需要做視覺自動化處理的工具,最后選用的軟件為python,剛好這個機會進行系統學習。短時間學習,需要快速開發,所以記錄要點步驟,防止忘記。 鏈接: 開源 python 應用 開發(一&#xf…

SeaTunnel 云倉連接器使用指南 | AI 助手解讀系列

最近體驗了一下 Deepwiki 的 AI 文檔生成功能,本文展示其自動生成的《SeaTunnel 云端數據倉庫連接器》文檔內容,歡迎大家一起“挑刺捉蟲”,看看 AI 寫技術文檔到底靠不靠譜? 本文檔介紹了 Apache SeaTunnel 的云數據倉庫連接器&a…

每日算法刷題Day51:7.21:leetcode 棧6道題,用時1h40min

二.進階 1.套路 2.題目描述 1.給你一個字符串 s 。它可能包含任意數量的 * 字符。你的任務是刪除所有的 * 字符。 當字符串還存在至少一個 * 字符時,你可以執行以下操作: 刪除最左邊的 * 字符,同時刪除該星號字符左邊一個字典序 最小的字…

網絡基礎DAY16-MSTP-VRRP

STP/RSTP的局限性1.所有VLAN共享一棵生成樹 2.無法實現不同VLAN在多條Trunk鏈路上的負載分擔 3.次優化二層路徑。MSTP的基本概念及優勢MSTP的定義MST域擁有相同MST配置標識的網橋構成的集合。 具體如何分辨是否是同一個域,就看域名,配置修訂號&#xff0…

freertos關鍵函數理解 uxListRemove

//刪除pxItemToRemove節點 UBaseType_t uxListRemove(ListItem_t *pxItemToRemove) { //The list item knows which list it is in. Obtain the list from the list item.//找到節點所在的鏈表//my_printf( "uxListRemove pxItemToRemove %#p\n", pxI…

C語言---番外篇(柔性數組)

前言: 由于這塊內容所謂綜合性比較高,有數組的知識,有結構體的知識,還有動態內存管理的知識,所以我就單獨寫一篇博客,此謂番外篇。 柔性數組的概念 定義在結構體的最后一個元素的位置且大小未知的數組就叫…

單片機的幾種GPIO輸入輸出模型詳解

模式選擇匯總參考表:模式輸出驅動輸入阻抗默認狀態典型應用場景推挽輸出強驅動禁用可配置LED, SPI, 高速信號開漏輸出弱驅動禁用低/懸空IC, 電平轉換, 線與浮空輸入禁用極高不確定外部強驅動信號上拉輸入禁用中高高電平按鍵(接地型), 數字輸入下拉輸入禁用中高低電平…

深度解析ECharts.js:構建現代化數據可視化的利器

引言:數據可視化的新時代挑戰 在數字化轉型浪潮中,數據可視化已成為企業決策和用戶體驗的關鍵環節。面對海量數據的呈現需求,傳統表格已無法滿足用戶對直觀洞察的渴求。作為百度開源的JavaScript可視化庫,ECharts.js憑借其強大的功…

從零構建實時通信引擎:Freeswitch源碼編譯與深度優化指南

一、構建工具:編譯FreeSWITCH及其依賴庫的基礎 1. CMake2. Autoconf 二、匯編器:提升音視頻處理性能 3. YASM / NASM 三、音視頻編解碼器:支撐實時媒體傳輸 4. Opus5. x264 (可選)6. libvpx / libvpx2 (可選) 四、多媒體框架與工具庫&#xf…

網絡原理 HTTP 和 HTTPS

目錄 一 . HTTP 協議 二 . 抓包 三 . HTTP 請求 / 響應的基本格式 (1)HTTP請求的基本格式 (2)HTTP響應的基本格式 四 . HTTP 方法 GET 和 POST 的區別: 五 . 請求報頭和響應報頭 (1&#…

基于單片機的自動條幅懸掛機

摘 要 隨著日新月異科技發展,在心率體溫測量方面,我們取得了迅速的發展,就近日而言,脈搏測量儀已經在多個領域大展身手,除了在醫學領域有所建樹,在人們的日常生活方面的應用也不斷拓展,如檢疫…

《C++》面向對象編程--類(中)

文章目錄一、構造函數1.1定義1.2語法1.3特性二、析構函數2.1定義2.2語法2.3特性三、拷貝構造函數3.1定義3.2語法3.3特性3.4淺拷貝3.4.1定義3.4.2淺拷貝的風險3.5深拷貝一、構造函數 1.1定義 在C中,構造函數(Constructor) 是一種特殊的成員函…

機器學習初學者理論初解

大家好! 為什么手機相冊能自動識別人臉?為什么購物網站總能推薦你喜歡的商品?這些“智能”背后,都藏著一位隱形高手——機器學習(Machine Learning)。一、什么是機器學習?簡單說,機器學習是教計…

原碼反碼補碼

在Java中,無論是小數還是整數,他們都要帶有符號(和C語言不同,C語言有無符號數)。首位就作為符號位。原碼反碼:正數的反碼是其原碼本身負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反…

使用ubuntu:20.04和ubuntu:jammy構建secretflow環境

一、使用ubuntu:20.04構建隱語編譯環境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(鉸鏈損失函數)詳解:SVM 中的關鍵損失函數

📌 一、什么是 Hinge Loss?Hinge Loss(鉸鏈損失),是 支持向量機(SVM, Support Vector Machine) 中常用的一種損失函數,用于最大間隔分類。其核心思想是:當預測結果已經正…

days32 :零基礎學嵌入式之網絡2.0

一、wireshark :網絡抓包工具1.功能:抓取通過電腦網卡的網絡數據2.作用:排查故障、抓取數據做數據分析、3.用法:(1)sudo wireshark(2)選擇需要抓取的網卡》any(3&#xf…

數字護網:一次深刻的企業安全體系靈魂演練

🧩 引言:什么是“護網”?—— 不止是攻防,更是企業安全能力的年度大考 每年,由國家相關部門牽頭的“護網行動”都如期而至,各大企事業單位的安全團隊也隨之進入高度戒備狀態。然而,“護網”遠非…

基于 NumPy 的高效數值計算技術解析與實踐指引

在數據處理與科學計算領域,高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石,以高性能多維數組對象及配套函數,成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算,通過向量化操作直接處理每個元素&#…