事務隔離(MySQL)

事務隔離 —— 為什么你改了我還看不見?

在數據庫中,事務(Transaction) 用于保證一組數據庫操作要么全部成功,要么全部失敗,這是一種原子性的操作機制。在 MySQL 中,事務的支持由存儲引擎層實現。但并非所有引擎都支持事務,比如 MySQL 原生的 MyISAM 引擎就不支持事務,而 InnoDB 引擎 則是主流的支持事務的引擎。


一、事務的四大特性(ACID)

特性含義
原子性(Atomicity)事務中包含的所有操作要么全部成功,要么全部失敗
一致性(Consistency)事務執行前后,數據庫都處于一致狀態
隔離性(Isolation)并發執行的事務之間彼此隔離,互不影響
持久性(Durability)事務一旦提交,對數據庫的修改就是永久性的,即使系統故障也不會丟失

二、隔離性與隔離級別

當多個事務并發執行時,若沒有隔離,就可能導致以下問題:

  • 臟讀(Dirty Read):讀取到未提交事務的數據
  • 不可重復讀(Non-repeatable Read):同一事務中多次讀取同一數據,值卻不同
  • 幻讀(Phantom Read):同一事務中兩次查詢返回的記錄數不同

為解決這些問題,SQL 標準定義了四種隔離級別:

1. 四大隔離級別說明

隔離級別描述會發生的問題
Read Uncommitted(讀未提交)可以讀取未提交事務修改的數據臟讀、不可重復讀、幻讀
Read Committed(讀已提交)只能讀取已提交事務修改的數據不可重復讀、幻讀
Repeatable Read(可重復讀)同一事務內多次讀取結果一致(MySQL 默認)幻讀(依賴間隙鎖解決)
Serializable(可串行化)強制事務串行執行,防止并發無臟讀/不可重復讀/幻讀,但效率低

注意:隔離級別越高,性能越差。需要根據業務需求做權衡。

2. 示例說明(圖示說明略,可自己繪圖添加)

假設有兩個事務 A 和 B,對某行數據進行讀寫操作:

  • 讀未提交 下,事務 A 會看到事務 B 的未提交修改
  • 讀已提交 下,A 只能看到 B 已提交的修改
  • 可重復讀 下,A 在整個事務中看到的始終是開始時的數據快照
  • 串行化 下,B 的寫操作會被阻塞,直到 A 完成

3. MySQL 中隔離級別的實現方式

  • Read Uncommitted:直接讀取最新數據,無視事務
  • Read Committed:每次 SQL 執行前創建一個視圖(Read View)
  • Repeatable Read:在事務開始時創建視圖,期間一直使用同一個視圖
  • Serializable:加鎖控制并發,防止沖突

在 MySQL 中,默認隔離級別為 Repeatable Read,但 Oracle 默認是 Read Committed

查詢當前隔離級別

SHOW VARIABLES LIKE 'transaction_isolation';

三、事務隔離的實現機制(MVCC)

以“可重復讀”為例,MySQL 使用 多版本并發控制(MVCC) 來實現事務隔離。

1. 回滾日志機制

  • 每條記錄在更新時都會生成一條回滾日志(undo log)
  • 當前值可以通過逐步回滾恢復到歷史版本
  • 不同事務通過自己的視圖(Read View)看到的版本可能不同

例如,某值從 1 → 2 → 3 → 4,回滾日志如下:

當前值回滾日志
43、2、1

視圖 A 啟動于值為 1 時,則通過回滾可看到 1;視圖 B 則可能看到 2。

2. MVCC 的優點

  • 允許讀取操作不加鎖,提升并發性能
  • 實現隔離級別無需加重鎖負擔

3. 回滾日志的回收問題

  • 回滾日志會在無事務再引用時被清除
  • 長事務 會阻止日志清理,導致存儲膨脹

實例:某系統數據僅 20GB,但 undo 日志達 200GB,最終只能重建數據庫解決。


四、事務的啟動方式及建議

1. 顯式啟動事務

BEGIN;
-- 或
START TRANSACTION;
-- 提交或回滾
COMMIT;
ROLLBACK;

2. 隱式啟動方式:autocommit=0

SET autocommit = 0;
  • 此模式下,即使執行一個簡單的 SELECT,也會自動開啟事務
  • 若未手動 COMMITROLLBACK,事務將一直占用資源,形成 隱性長事務

建議

  • 使用 SET autocommit=1(默認),通過顯式語句控制事務
  • 使用 COMMIT WORK AND CHAIN 可在提交后立即開啟下一個事務
-- 查看運行超過60秒的事務
SELECT * 
FROM information_schema.innodb_trx 
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;

五、總結

  • 事務隔離是數據庫并發控制的核心機制
  • 在 MySQL 中,推薦使用默認的 Repeatable Read + MVCC 實現事務隔離
  • 盡量避免隱式長事務,主動控制事務生命周期
  • 根據實際業務權衡性能與隔離性的需求

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

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

相關文章

華為昇騰910B通過vllm部署InternVL3-8B教程

前言 本文主要借鑒:VLLM部署deepseek,結合自身進行整理 下載模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")環境配置 auto-dl上選擇單卡…

Spring Boot 3 + Undertow 服務器優化配置

優化背景 當你的application需要支持瞬時高并發的時候,tomcat已經不在是最優的選擇,我們可以改為Undertow,并對其進行優化。 Undertow 是一個輕量級的、高性能的Java Web 服務器,由JBoss 開發并開源。它是基于非阻塞(…

利用 Python pyttsx3實現文字轉語音(TTS)

今天,我想跟大家分享如何利用 Python 編程語言,來實現文字轉換為語音的功能,也就是我們常說的 Text-to-Speech (TTS) 技術。 你可能會好奇,為什么學習這個?想象一下,如果你想把書本、文章、雜志的內容轉換…

vue修改了node_modules中的包,打補丁

1、安裝patch npm i patch-package 安裝完成后,會在package.json中顯示版本號 2、在package.json的scripts中增加配置 "postinstall": "patch-package" 3、執行命令 npx patch-package 修改的node_modules中的包的名稱 像這樣 npx patch-packag…

Vue3快速入門/Vue3基礎速通

Vue3 漸進式的javascript框架&#xff0c;我們可以逐步引入vue的功能 官方文檔 Vue.js中文手冊 你可以借助 script 標簽直接通過 CDN 來使用 Vue&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script>通過 CDN 使用 Vue 時…

[人機交互]理解界面對用戶的影響

零.重點 – 什么是情感因素 – 富有表現力的界面 – 用戶的挫敗感 – 擬人化在交互設計中的應用 – 虛擬人物&#xff1a;代理 一.什么是情感方面 情感是指某事物對心理造成的一種狀態 二.計算機科學中存在的兩個相關的研究領域 2.1情感計算 機器如何能感知其他代理的情感&…

Ubuntu22.04及以上版本buildroot SIGSTKSZ 報錯問題

本文提供一種解決 Buildroot SIGSTKSZ 報錯途徑 解決途徑來源參考&#xff1a;Buildroot error when building with Ubuntu 21.10 其出現原因在于 GNU C Library 2.34 release announcement&#xff1a; Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…

Spark處理過程-案例數據清洗

&#xff08;一&#xff09;需求說明 準備十條符合包含用戶信息的文本文件&#xff0c;每行格式為 姓名,年齡,性別&#xff0c;需要清洗掉年齡為空或者非數字的行。 例如&#xff1a; 張三,25,男 李四,,女 王五,30,男 趙六,a,女 孫七,35,男 周八,40,女 吳九,abc,男 鄭十,45,女…

多模態大語言模型arxiv論文略讀(六十五)

VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文標題&#xff1a;VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文作者&#xff1a;Zhen Chen, Xingjian Luo, Jinlin Wu, Danny T. M. Chan, Zhen Lei, Jinqi…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戲</title> <style>bo…

算法訓練營第十一天|150. 逆波蘭表達式求值、239. 滑動窗口最大值、347.前 K 個高頻元素

150. 逆波蘭表達式求值 題目 思路與解法 第一思路&#xff1a; 比較簡單 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目錄 一、核心特點 二、原生 IP 的常見應用 三、原生 IP vs. 數據中心 IP 四、如何獲取原生 IP&#xff1f; 五、原生 IP 的優缺點 六、實際案例 原生 IP&#xff08;Native IP&#xff09; 是指由互聯網服務提供商&#xff08;ISP&#xff09;直接分配給用戶的 IP 地址&…

k8s的pod掛載共享內存

k8s的pod掛載共享內存&#xff0c;限制不生效問題&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系統中用于共享內存的特殊路徑。通過將 emptyDir 的 medium 設置為 Memory&#xff0c;可以確保 /dev/shm 正確地掛載到一個基于內存的文件系統&#xff0c;從而實現高效的共享內…

DOCX轉PDF怎么操作最簡單?快速將DOCX轉換為專業PDF文檔

在日常辦公或學習中&#xff0c;我們經常需要將 Word 文檔&#xff08;.docx格式&#xff09;轉換為 PDF 文件。這不僅有助于保持文檔格式的一致性&#xff0c;還能確保接收者無需特定軟件即可查看文件內容。本文將詳細介紹幾種常見的方法來實現從 DOCX 到 PDF 的轉換&#xff…

VUE+ElementUI 使用el-input類型type=“number” 時,取消右邊的上下箭頭

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 在項目中有時候需要輸入框的type“number”&#xff0c;這個時候&#xff0c;輸入框的右邊就會出現兩個按鈕&#xff0c;這兩個按鈕可以遞增/遞減&#xff0c;但是這樣輸入框看上去就不太美觀&#x…

深入淺出理解常見的分布式ID解決方案

目錄 UUID 自增ID 數據庫多主模式 號段模式 Redis 雪花算法 百度 UIDgenerator 美團Leaf 滴滴TinyID 實戰中的分布式ID生成器&#xff01;保障數據唯一性的核心組件 怎么編寫Lua腳本是關鍵 怎么執行&#xff1f; 總結 分布式ID在構建大規模分布式系統時扮演著至關…

技術視界 | 青龍機器人訓練地形詳解(一):如何創建一個地形

機器人強化學習中的地形訓練是利用強化學習算法讓機器人在不同地形環境中通過試錯學習最優行為策略的過程&#xff0c;通過環境建模、策略學習與優化等環節&#xff0c;使機器人能夠自主適應復雜多變的地形&#xff0c;提高其移動效率、穩定性和自主性&#xff0c;減少人為干預…

【SGL】Scatter-Gather List內存傳輸技術

文章目錄 1. What is SGL&#xff1f;2. sgl內存傳輸的原理2.1 核心思想2.2 sgl數據結構2.3 摘鏈和掛鏈 3. 零拷貝技術3.1 問題背景3.2 零拷貝的核心思想及實現方式 4. sgl在存儲行業的應用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;內存傳…

10.idea中創建springboot項目_jdk17

10.idea中創建springboot項目_jdk17 一、前期準備 安裝與配置&#xff1a; 確保已安裝 IntelliJ IDEA配置好 JDK17 二、創建 Maven 項目 新建項目&#xff1a; 點擊 File → New → Project&#xff0c;選擇左側的 Maven。填寫項目名稱&#xff08;如 demo&#xff09;、存…

如何使用極狐GitLab 軟件包倉庫功能托管 ruby?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 軟件包庫中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 軟件包庫正在開發中&#xff0c;由于功能有限&#xff0c;尚未準備好…