圖解Mysql原理:深入理解事務的特性以及它的實現機制

前言

大家好,我是程序蛇玩編程。

Mysql中事務大家不陌生吧,事務就是要保證一組數據庫操作,要么全部成功,要么全部失敗。那它具有哪些特性,如何實現的呢?接著往下看。

正文

事務的特性:

事務的基本特性主要為四種,原子性,一致性,隔離性,持久性,下面一一介紹:

1.原子性(Atomicity):事務是數據庫的邏輯工作單位,事務中包含的各操作要么全部成功,要么全部失敗。如果事務中的某個操作失敗,整個事務將回滾(Rollback),撤銷所有已執行的操作,返回到事務開始前的狀態。

2.一致性:一致性狀態是指數據庫中的數據應滿足所有預定義的規則和約束,例如實體完整性、參照完整性等。

3.隔離性:并發執行的事務之間不會相互影響,每個事務都感覺不到其他事務的存在。事務的隔離性有不同的級別,包括讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重復讀(Repeatable Read)和串行化(Serializable)。

4.持久性:一旦事務被提交(Commit),它對數據庫的修改就是永久性的,即使系統發生故障也不會丟失。

今天主要向大家介紹隔離性,他能解決什么問題呢? 假如事務沒有隔離性的話,多個事務同時執行的時候就可能出現臟讀、不可重復讀、幻讀的問題,于是就誕生了隔離性,它有如上述的四種隔離級別。

1.讀未提交是指,一個事務可以讀取到其他事務未提交的數據。

2.讀提交是指,一個事務只能讀取到其他事務已經提交的數據。

3.可重復讀是指,它確保了一個事務在執行期間可以多次讀取相同的數據集,而不會看到其他并發事務對這些數據所做的更改。

4.串行化,顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。

其中"讀提交"和"可重復讀"較難理解,我舉了一個例子如下圖所示,假設數據表S只有一列,一行的值為1,兩個事務按照時間順序執行。

Snipaste_2024-12-25_14-14-58

我們來看看事務A在不同的隔離級別下,分別返回什么結果。

若隔離級別是"讀提交",則a1是1,a2是2,事務B的更改在提交后才能被事務A看到,所以a3也是2。

若隔離級別是"可重復讀",則a1,a2都是1,a3才是2,之所以a2是1,遵循的就是這個要求:事務在執行期間看到的數據前后必須是一致的。

那如何做到事務看還是看不見的呢?

數據庫里面會創建一個視圖,訪問的時候以視圖的邏輯結果為準。在“可重復讀”隔離級別下,這個視圖是在事務啟動時創建的,整個事務存在期間都用這個視圖。而在“讀提交”隔離級別下,這個視圖是在每個 SQL 語句開始執行的時候創建的。這里需要注意的是,“讀未提交”隔離級別下直接返回記錄上的最新值,沒有視圖概念;而“串行化”隔離級別下直接用加鎖的方式來避免并行訪問。

事務隔離的實現:

在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值。

我們假設一個值從10被按順序改成了11,12,13,在回滾日志(undolog)中有如下記錄:

Snipaste_2024-12-25_14-29-44

當前值是 13,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的 視圖。視圖 A、B、C 里面,這一個記錄的值分別是 10、11、13,同一條記錄在系統中可以存在多個版本,這就是數據庫的多版本并發控制(MVCC)。

今日小結

今天簡單給大家介紹了事務的四大特性,并用一個例子說明了不同隔離級別下事務查詢返回的結果,最后述說了事務隔離的實現,講到了回滾日志以及視圖,下一期我們再會。很多八股文內容合集就來這哈。

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

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

相關文章

進行網頁開發時,怎樣把function()中變量值在控制臺輸出,查看?

在網頁開發過程中&#xff0c;為了及時了解JavaScript中的function函數中的變量值&#xff0c;可以用控制臺命令console.log()把變量的值在控制臺輸出&#xff0c;方便調試時對函數變量值進行了解。 看下面的一段示例&#xff1a; <!DOCTYPE html> <html> &l…

linux內核進程管理(1)——創建,退出

linux源碼閱讀——進程管理&#xff08;1&#xff09; 1. 進程的基本介紹1.1 linux中進程和線程的區別1.2 task_struct中的基本內容1.3 命名空間ns(namespace)命名空間結構圖Linux 中的命名空間類型 1.4 進程標識符 2. 創建一個進程的流程2.1 CLONE宏2.2 創建進程系統調用1. do…

人像面部關鍵點檢測

此工作為本人近期做人臉情緒識別&#xff0c;CBAM模塊前是否能加人臉關鍵點檢測而做的嘗試。由于創新點不是在于檢測點的標注&#xff0c;而是CBAM的改進&#xff0c;因此&#xff0c;只是借用了現成庫Dilb與cv2進行。 首先&#xff0c;下載人臉關鍵點預測模型:Index of /file…

【Python】每隔一段時間自動清除網站上cookies的方法

我在寫爬蟲的時候&#xff0c;經常會因為點擊瀏覽太多的頁面&#xff0c;而導致很多的cookies累積。 雖然單個Cookie很小&#xff0c;但長期積累可能占用瀏覽器存儲空間&#xff0c;導致瀏覽器運行變慢&#xff08;尤其對老舊設備&#xff09;。 而且Cookies&#xff08;尤其…

非隔離電源芯片WT5104

非隔離電源芯片WT5104 非隔離電源芯片 WT5104 介紹 WT5104 是一款超高效且高精度的非隔離降壓開關電源恒壓控制驅動芯片&#xff0c;在各類電源轉換場景中提供5V輔助電源供電發揮著重要作用。 一、芯片特點 高集成度&#xff1a;內部集成 800V 功率 MOSFET&#xff0c;極大減…

基于 Python 的自然語言處理系列(83):InstructGPT 原理與實現

&#x1f4cc; 論文地址&#xff1a;Training language models to follow instructions with human feedback &#x1f4bb; 參考項目&#xff1a;instructGOOSE &#x1f4f7; 模型架構圖&#xff1a; 一、引言&#xff1a;為什么需要 InstructGPT&#xff1f; 傳統的語言模型…

零基礎入門 Verilog VHDL:在線仿真與 FPGA 實戰全流程指南

摘要 本文面向零基礎讀者,全面詳解 Verilog 與 VHDL 兩大主流硬件描述語言(HDL)的核心概念、典型用法及開發流程。文章在淺顯易懂的語言下,配合多組可在線驗證的示例代碼、PlantUML 電路結構圖,讓你在 EDA Playground 上動手體驗數字電路設計與仿真,并深入了解從 HDL 編寫…

Kubernetes控制平面組件:API Server詳解(二)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…

云服務器存儲空間不足導致的docker image運行失敗或Not enough space in /var/cache/apt/archives

最近遇到了兩次空間不足導致docker實例下的mongodb運行失敗的問題。 排查錯誤 首先用nettools看下mongodb端口有沒有被占用&#xff1a; sudo apt install net-tools netstat --all --program | grep 27017 原因和解決方案 系統日志文件太大 一般情況下日志文件不會很大…

爬蟲學習——下載文件和圖片、模擬登錄方式進行信息獲取

一、下載文件和圖片 Scrapy中有兩個類用于專門下載文件和圖片&#xff0c;FilesPipeline和ImagesPipeline&#xff0c;其本質就是一個專門的下載器&#xff0c;其使用的方式就是將文件或圖片的url傳給它(eg:item[“file_urls”])。使用之前需要在settings.py文件中對其進行聲明…

拒絕用電“盲人摸象”,體驗智能微斷的無縫升級

&#x1f31f; 為什么需要智能微型斷路器&#xff1f; 傳統斷路器只能被動保護電路&#xff0c;而安科瑞智能微型斷路器不僅能實時監測用電數據&#xff0c;還能遠程控制、主動預警&#xff0c;堪稱用電安全的“全能衛士”&#xff01;無論是家庭、工廠還是商業樓宇&#xff0…

如何優雅地為 Axios 配置失敗重試與最大嘗試次數

在 Vue 3 中&#xff0c;除了使用自定義的 useRequest 鉤子函數外&#xff0c;還可以通過 axios 的攔截器 或 axios-retry 插件實現接口請求失敗后的重試邏輯。以下是兩種具體方案的實現方式&#xff1a; 方案一&#xff1a;使用 axios 攔截器實現重試 實現步驟&#xff1a; 通…

【Leetcode刷題隨筆】242.有效的字母異位詞

1. 題目描述 給定兩個僅包含小寫字母的字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞。 字母異位詞定義&#xff1a;兩個字符串包含的字母種類和數量完全相同&#xff0c;但順序可以不同&#xff08;例如 “listen” 和 “silent”&#xff09;。 …

示例:spring xml+注解混合配置

以下是一個 Spring XML 注解的混合配置示例&#xff0c;結合了 XML 的基礎設施配置&#xff08;如數據源、事務管理器&#xff09;和注解的便捷性&#xff08;如依賴注入、事務聲明&#xff09;。所有業務層代碼通過注解簡化&#xff0c;但核心配置仍通過 XML 管理。 1. 項目結…

Crawl4AI:打破數據孤島,開啟大語言模型的實時智能新時代

當大語言模型遇見數據饑渴癥 在人工智能的競技場上&#xff0c;大語言模型&#xff08;LLMs&#xff09;正以驚人的速度進化&#xff0c;但其認知能力的躍升始終面臨一個根本性挑戰——如何持續獲取新鮮、結構化、高相關性的數據。傳統數據供給方式如同輸血式營養支持&#xff…

【機器學習-周總結】-第4周

以下是本周學習內容的整理總結&#xff0c;從技術學習、實戰應用到科研輔助技能三個方面歸納&#xff1a; 文章目錄 &#x1f4d8; 一、技術學習模塊&#xff1a;TCN 基礎知識與結構理解&#x1f539; 博客1&#xff1a;【時序預測05】– TCN&#xff08;Temporal Convolutiona…

Mysql--基礎知識點--79.1--雙主架構如何避免回環復制

1 避免回環過程 在MySQL雙主架構中&#xff0c;GTID&#xff08;全局事務標識符&#xff09;通過以下流程避免數據回環&#xff1a; 1 事務提交與GTID生成 在Master1節點&#xff0c;事務提交時生成一個全局唯一的GTID&#xff08;如3E11FA47-71CA-11E1-9E33-C80AA9429562:2…

安寶特科技 | AR眼鏡在安保與安防領域的創新應用及前景

隨著科技的不斷進步&#xff0c;增強現實&#xff08;AR&#xff09;技術逐漸在多個領域展現出其獨特的優勢&#xff0c;尤其是在安保和安防方面。AR眼鏡憑借其先進的功能&#xff0c;在機場、車站、海關、港口、工廠、園區、消防局和警察局等行業中為安保人員提供了更為高效、…

Linux第十講:進程間通信IPC

Linux第十講&#xff1a;進程間通信IPC 1.進程間通信介紹1.1什么是進程間通信1.2為什么要進程間通信1.3怎么進行進程間通信 2.管道2.1理解管道2.2匿名管道的實現代碼2.3管道的五種特性2.3.1匿名管道&#xff0c;只能用來進行具有血緣關系的進程進行通信(通常是父子)2.3.2管道文…

微信小程序通過mqtt控制esp32

目錄 1.注冊巴法云 2.設備連接mqtt 3.微信小程序 備注 本文esp32用的是MicroPython固件&#xff0c;MQTT服務用的是巴法云。 本文參考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注冊巴法云 注冊登陸并新建一個topic&#xff…