MySQL事務機制

目錄

原子性

持久性?

隔離性

隔離級別(并發事務之間的關系)

讀未提交

讀已提交

可重復讀

串行化(最嚴格的隔離級別)

一致性

問題

不可重復讀性(已經提交的數據)

什么是臟讀問題(未提交的數據)?

幻讀

保存點

自動提交機制--autocommit

會話隔離級別與全局隔離級別


原子性

事務原子性是指在數據庫操作中,事務要么全部執行成功,要么全部執行失敗,不存在部分執行成功部分執行失敗的情冿。事務原子性保證了數據的一致性和可靠性,確保數據庫中的數據不會出現不一致的情況。當一個事務中的所有操作都成功完成時,事務被提交;當有任何一個操作失敗時,事務將會被回滾,使得數據回到事務開始之前的狀態。這樣保證了數據庫中的數據始終處于一致的狀態。

持久性?

事務持久性是指一旦事務成功提交,其所做的改變就會永久保存在數據庫中,即使系統發生故障或意外斷電也不會丟失。數據庫系統通過將事務的操作記錄持久化保存在磁盤上來實現事務的持久性,確保數據庫的一致性和可靠性。要實現事務的持久性,數據庫系統通常會使用日志記錄和事務提交機制來保證事務的持久性。

隔離性

隔離級別(并發事務之間的關系)

隔離怎么理解?

隔離級別是相對于自己的事務還是其他事務

-->是相對于自己會話的事務來說的,先簡單的拿讀已提交為例;

自己會話的事務讀取其他客戶端的事務的數據必須是已經提交的;并不是自己設置事務為讀已提交,其他客戶端的事務就讀不到的我的事務的數據了,有可能其他事務設置的是讀未提交,如此,可以實時的獲取我的事務的數據;

讀未提交

那么什么是讀未提交級別呢?

-->可以讀到未提交的數據。就這么簡單。

默認情況下,我開啟了一個事務,還向表中插入了一行元組,但是我沒有提交事務,由于事務的隔離性,其他事務是讀不到我新插入的一行數據的,只能讀到這個事務之前的數據;

但是,現在我把事務隔離級別設置為是“讀未提交”,那么即便我不提交事務,其他客戶端也可以讀到我這個新插入的數據了;

總結:讀未提交隔離級別下,事務的任何修改都是透明的,,都可以被其他客戶端讀到,但是他們沒法訪問;

代碼示例:

設置全局事務隔離級別(讀未提交):

Set global transaction isolation level read uncommitted;

查看全局事務級別:

SELECT @@transaction_isolation;

?向表中插入一行數據但不commit,我們會發現右邊的事務也能夠看到新數據;

解釋:

開啟事務,向price表中插入一行數據,但不提交,再打開一個客戶端,查看price表,發現新增了一條數據,

insert into price values(1,"小小",500);

事務回滾,重新查看price表,發現剛才的元組沒了;

讀已提交

只能讀到其他事務已經提交的數據;如果別的客戶端不提交事務,那么我們就讀到的始終是舊數據;

設置隔離級別SQL語句: set? session transaction isolation level read committed;

可重復讀

可重復讀,我們可以這么理解,我們設置當前會話隔離級別是可重復讀,那么意思就是"放心讀,不用擔心數據會更改",事實是,他跟讀已提交的區別就在于即便有其他事務把數據更改了提交了,我當前事務讀到的數據依舊是原來的數據,不會改變,這就是可重復讀;

所以可重復讀級別下讀到的數據是其他事務開始之前的數據;即便其他事務提交了,讀到的數據也不會發生變化;

串行化(最嚴格的隔離級別)

將所有的事務串行執行,同一時間只有一個事務在執行;類似與加鎖;--->效率問題

一致性

一致性簡單來講就是對數據的操作要合理;

比如:小紅轉給小明100塊錢,那最后的結果就是小紅余額減少100元,小明的余額增加100元,這就是要保持一致,如果小紅的余額沒減貨或者小明的余額沒增,那就是不一致;

?一致性算是一種目的和要求,通過前面的原子性,隔離性,持久性來保證事務的一致性;

問題

不可重復讀性(已經提交的數據)

在MySQL事務中,不可重復讀(non-repeatable read)是指在同一個事務中多次讀取相同的數據,但在讀取過程中數據發生了變化,導致多次讀取的結果不一致的情況。這可能會導致事務在處理過程中出現異常或錯誤的情況。

不可重復讀的典型例子如下:

  1. 事務A在讀取一行數據后,事務B修改了這行數據,然后事務A再次讀取同一行數據,此時讀取的數據已經發生了變化,造成不一致。
  2. 事務A在讀取一批數據后,事務B刪除了其中的一部分數據,然后事務A再次讀取同一批數據,發現有部分數據已經被刪除,導致不一致。

簡單來說就是,我沒有把握確定當前數據具體的值,因為他隨時可能變化;?

什么是臟讀問題(未提交的數據)?

其他事務讀到的數據可能被修改了,比如,事務A開啟事務,事務B讀到了一個數據行。但是B事務讀取完畢后,事務A馬上就修改了那一個數據行,所以就造成了事務B拿到的數據是"假數據",這就是"臟讀“;

幻讀

幻讀是指一個事務在執行過程中,按照相同的查詢條件多次查詢,由于其他事務插入或刪除了滿足查詢條件的新數據,導致結果集的行數發生變化。

重點:其他事務插入貨刪除數據,導致的結果集發生變化;

哪種隔離級別會出現幻讀現象?

-->讀未提交,讀已提交;

這兩種都是我在執行事務的時候可以讀到別的事務操作過的數據;

保存點

SQL語句:savepoint 保存點名稱;

開啟事務后,可以通過設置保存點決定回滾到哪一次保存前的內容

示例:

準備好的一個表;

?我向表中插入了兩行數據,插入后保存了兩個保存點;

?現在我們回到保存點s1處的狀態;我們會發現表就是s1保存時的狀態;

?現在試試能不能回到s2了;-->是無法回到時間點后面的保存點的;

自動提交機制--autocommit

SQL語句:Set autocommit=1(默認就是自動提交的)

?因為默認就是自動提交的所以我這里設為不自動提交;

?什么是默認提交呢?

-->顧名思義,就是我執行完任意一條SLQ語句后都相當于是一個事務,自動commit;

我們平時寫的一個SQL語句就是一個事務;

下面我們來驗證下,在不自動提交的情況下是什么樣的:

首先,左邊的我設置為不自動提交,右邊的設置為自動提交,隔離級別都是可重復讀;

?我插入在左邊的客戶端向表中插入了一行數據,但是不commit;我們發現右邊查不到新的數據,這是因為左邊的事務沒有提交,一個SQL語句已經不再是一個完整的事務了。

下面把左邊的事務提交了試試看,發現左邊的事務提交了之后,右邊才可以看到新的數據行;

會話隔離級別與全局隔離級別

會話隔離級別:設置當前客戶端的隔離級別,不會影響到其他的客戶端的隔離級別。

全局隔離級別:設置所有客戶端的隔離級別,對象是該服務端對應的所有的客戶端;

簡單來講,一個是全局變量,一個是局部變量;使用的時候是局部優先,因此我們修改會話級別的時候記得修改當前會話的級別,如果修改的是全局的隔離級別,其實還是使用的局部的會話隔離級別,記得檢查一下;

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

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

相關文章

Cadence學習筆記之---直插元件的封裝制作

目錄 01 | 引 言 02 | 環境描述 03 | 操作步驟 04 | 結 語 01 | 引 言 在之前發布的Cadence小記中,已經講述了怎樣制作熱風焊盤,貼片(SMD)焊盤、通孔、過孔,以及貼片元件的封裝。 本篇關于Cadence的小記主要講如何制作直插元件的封裝。 …

【第四十周】文獻閱讀:用于檢索-增強大語言模型的查詢與重寫

目錄 摘要Abstract用于檢索-增強大語言模型的查詢與重寫研究背景方法論基于凍結LLM的重寫方案基于可訓練重寫器的方案重寫器預熱訓練(Rewriter Warm-up)強化學習(Reinforcement Learning) 創新性實驗結果局限性總結 摘要 這篇論文…

java學習總結(if switch for)

一.基本結構 1.單分支if int num 10; if (num > 5) {System.out.println("num 大于 5"); } 2.雙分支if-else int score 60; if (score > 60) {System.out.println("及格"); } else {System.out.println("不及格"); } 3.多分支 int…

yum的基本操作和vim指令

在我們的手機端或者Windows上下載軟件,可以在相應的應用商店或者官網進行下載,這樣對于用戶來說十分的方便和便捷。而在Linux上,也有類似的安裝方式,我們來一一了解一下。 Linux安裝軟件的3種方法 源代碼安裝 在Linux下安裝軟件…

C++ CUDA開發入門

CUDA開發筆記 文章目錄 CUDA開發筆記[toc]1 概述2 環境3 命令行編譯4 CMAKE引入CUDA5 vscode開發CUDA6 Qt中使用CUDA-CMake7 QMake配置CUDA8 核函數9 核函數調用9.1 核函數調用語法9.2 執行配置參數詳解9.3 關鍵調用步驟9.4 重要注意事項9.5 調用示例分析9.6 最佳實踐建議 10 線…

llm開發框架新秀

原文鏈接:https://i68.ltd/notes/posts/20250404-llm-framework3/ google開源ADK-Agent Development Kit 開源的、代碼優先的 Python 工具包,用于構建、評估和部署具有靈活性和控制力的復雜智能體項目倉庫:https://github.com/google/adk-python 2.6k項目文檔:Age…

VM——相機拍照失敗

1、問題:相機頻閃觸發,在MVS中正常出圖,在VM中出現拍照失敗 2、解決: 1、首先排查網絡設置(巨幀是否設置) 2、電腦的所有防火墻是否關閉 3、在MVS中恢復相機的設置參數為默認參數,刪除VM中的全…

【時頻譜分析】小波分析

算法配置頁面,也可以一鍵導出結果數據 報表自定義繪制 獲取和下載【PHM學習軟件PHM源碼】的方式 獲取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

怎么免費下載GLTF/GLB格式模型文件,還可以在線編輯修改

? 現在非常流行glb格式模型,和gltf格式文件,可是之類模型網站非常非常少 1,咱們先直接打開http://glbxz.com 官方glb下載網站 glbxz.com 2 可以搜索,自己想要的模型關鍵詞 3,到自己想下載素材頁面 4,…

【6】深入學習http模塊(萬字)-Nodejs開發入門

深入學習http模塊 前言http一個Web服務器項目創建代碼運行代碼解析 Server屬性:keepAlive屬性:keepAliveTimeout屬性:maxHeaderSize屬性:requestTimeout屬性:maxRequestsPerSocket方法:close()方法&#xf…

buuctf sql注入類練習

BUU SQL COURSE 1 1 實例無法訪問 / Instance cant be reached at that time | BUUCTF但是這個地方很迷惑就是這個 一個 # 我們不抓包就不知道這個是sql注入類的判斷是 get 類型的sql注入直接使用sqlmap我們放入到1.txt中 目的是 優先檢測 ?id1>python3 sqlmap.py -r 1.t…

(即插即用模塊-特征處理部分) 三十二、(TGRS 2024) MDAF 多尺度雙表示對齊過濾器

文章目錄 1、Multiscale Dual-Representation Alignment Filter2、代碼實現 paper:SFFNet: A Wavelet-Based Spatial and Frequency Domain Fusion Network for Remote Sensing Segmentation Code:https://github.com/yysdck/SFFNet 1、Multiscale Dual-…

Python 中為什么 hash(-1) == hash(-2)?

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 讓我們從哪里開始?獲取源代碼!讓我們瀏覽一下這是正確/完整的答案嗎?結論前幾天在瀏覽 Reddit 時,我在 r/Python 上看到了這樣一個…

基于PySide6與pycatia的CATIA繪圖比例智能調節工具開發全解析

引言:工程圖紙自動化處理的技術革新 在機械設計領域,CATIA圖紙的比例調整是高頻且重復性極強的操作。傳統手動調整方式效率低下且易出錯。本文基于PySide6pycatia技術棧,提出一種支持智能比例匹配、實時視圖控制、異常自處理的圖紙批處理方案…

macos下 ragflow二次開發環境搭建

參考官網鏈接 https://ragflow.io/docs/dev/launch_ragflow_from_source虛擬環境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安裝 …

libva之ffavdemo分析

ffavdemo 代碼庫實現了一個基于FFmpeg和VAAPI的硬件加速視頻解碼與渲染框架,主要用于演示視頻解碼與渲染的完整硬件加速流程。支持多種渲染后端(X11、DRM、EGL),適應不同顯示環境。包含視頻處理過濾器,可進行格式轉換和…

JavaWeb 課堂筆記 —— 09 MySQL 概述 + DDL

本系列為筆者學習JavaWeb的課堂筆記,視頻資源為B站黑馬程序員出品的《黑馬程序員JavaWeb開發教程,實現javaweb企業開發全流程(涵蓋SpringMyBatisSpringMVCSpringBoot等)》,章節分布參考視頻教程,為同樣學習…

精品推薦 | 湖倉一體電商數據分析平臺實踐教程合集(視頻教程+設計文檔+完整項目代碼)

精品推薦,湖倉一體電商數據分析平臺實踐教程合集,包含視頻教程、設計文檔及完整項目代碼等資料,供大家學習。 1、項目背景介紹及項目架構 2、項目使用技術版本及組件搭建 3、項目數據種類與采集 4、實時業務統計指標分析一——ODS分層設計與數…

【人工智能】大語言模型多義詞解析技術揭秘——以“項目“歧義消解為例

今天田辛老師和小伙伴探討了一個有趣的多義詞問題, 在人工智能技術日新月異的今天,大語言模型(LLM)對自然語言的理解能力已經達到令人驚嘆的水平。大模型到底是如何去區分多義詞的? 比如:當用戶提到"…

【maxENT】最大熵模型(Maximum Entropy Model)R語言實現

文章目錄 一、相關package介紹1.1 dismo 包1.2 raster包1.3 常見問題與解決 二、代碼示例 🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介紹與使用(maxENT軟件) ASCII文件太大&#…