MySQL 事務解析

1. 事務簡介

事務(Transaction)?是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

經典案例:轉賬場景
以張三給李四轉賬 1000 元為例,正常流程需包含三步:

  1. 檢查張三賬戶余額
  2. 張三賬戶扣除 1000 元
  3. 李四賬戶增加 1000 元

正常情況: 轉賬這個操作, 需要分為以下這么三步來完成 , 三步完成之后, 張三減少1000, 而李四增加1000, 轉賬成功 :

異常情況: 轉賬這個操作, 也是分為以下這么三步來完成 , 在執行第三步是報錯了, 這樣就導致張三減少1000塊錢, 而李四的金額沒變, 這樣就造成了數據的不一致, 就出現問題了

為了解決上述的問題,就需要通過數據的事務來完成,我們只需要在業務邏輯執行之前開啟事務,執行完畢后提交事務。如果執行過程中報錯,則回滾事務,把數據恢復到事務開始之前的狀態

注意: 默認MySQL的事務是自動提交的,也就是說,當執行完一條DML語句時,MySQL會立即隱式的提交事務。

2. 事務操作

2.1 事務控制方式

方式一:修改全局提交模式(手動提交)

-- 查看事務提交模式(1為自動提交,0為手動提交)
SELECT @@autocommit;  
-- 設置為手動提交模式
SET @@autocommit = 0;  -- 提交事務(手動確認所有操作生效)
COMMIT;  
-- 回滾事務(撤銷所有未提交操作)
ROLLBACK;  

注意:修改全局模式后,所有 DML 語句需手動提交,否則不會生效。

方式二:單次事務控制(推薦使用)

-- 開啟事務
START TRANSACTION;  -- 或 BEGIN;-- 業務操作(以轉賬為例)
SELECT * FROM account WHERE name = '張三';  -- 查詢余額
UPDATE account SET money = money - 1000 WHERE name = '張三';  -- 扣款
UPDATE account SET money = money + 1000 WHERE name = '李四';  -- 入賬-- 根據執行結果決定提交或回滾
COMMIT;  -- 成功時提交
ROLLBACK;  -- 失敗時回滾

3. 事務四大特性(ACID)

  • 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。

  • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態。

  • 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行。

  • 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。

上述就是事務的四大特性,簡稱ACID。

4. 并發事務的三大問題

4.1 臟讀(Dirty Read)

問題:一個事務讀到另外一個事務還沒有提交的數據

此時有兩個事務,一個事務A,一個事務B,首先事務A去數據庫查詢id為1的這條數據,然后執行了update修改了id為1的這個數據,但是此時事務A還沒有提交事務,然后事務B去查詢id為1的數據的時候,卻查詢到了事務A修改后的數據,這種情況就稱為臟讀。

4.2 不可重復讀(Non-repeatable Read)

問題:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀

此時有兩個事務,一個事務A,一個事務B,事務A先查詢id為1的數據,然后事務B修改了id為1的數據,等到事務A再次去查詢id為1的數據的時候,此時讀取到的是事務B修改后的數據,這個時候,在事務A中,兩次查詢的操作,查詢的數據不一致,此時就出現了不可重復度的問題。

4.3 幻讀(Phantom Read)

問題:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據 已經存在,好像出現了 "幻影"

此時有兩個事務,一個事務A,一個事務B,事務A先去查詢id為1的數據,查詢到的結果為空,然后事務B插入id為1的數據,然后等到事務A去插入id為1的數據的時候,就報錯了,說主鍵沖突,然后事務A在去查詢id為1的數據,但是查詢到的結果還是空,此時就發生了,幻讀的問題。

5. 事務隔離級別

為了解決并發事務所引發的問題,在數據庫中引入了事務隔離級別。主要有以下幾種:

隔離級別臟讀不可重復讀幻讀性能影響
Read Uncommitted(讀未提交)最高
Read Committed(讀已提交)×較高
Repeatable Read(可重復讀,MySQL 默認)××中等
Serializable(串行化)×××最低
-- 查看當前事務隔離級別
SELECT @@TRANSACTION_ISOLATION;-- 設置隔離級別(SESSION為當前會話,GLOBAL為全局)
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};

注意:事務隔離級別越高,數據越安全,但是性能越低。其中Mysql中默認的事物隔離級別時可重復度,隔離級別需要根據實際的情況選擇。

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

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

相關文章

PyTorch中 torch.utils.data.DataLoader 的詳細解析和讀取點云數據示例

一、DataLoader 是什么? torch.utils.data.DataLoader 是 PyTorch 中用于加載數據的核心接口,它支持: 批量讀取(batch)數據打亂(shuffle)多線程并行加載(num_workers)自…

在MDK中自動部署LVGL,在stm32f407ZGT6移植LVGL-8.4,運行demo,顯示label

在MDK中自動部署LVGL,在stm32f407ZGT6移植LVGL-8.4 一、硬件平臺二、實現功能三、移植步驟1、下載LVGL-8.42、MDK中安裝LVGL-8.43、配置RTE4、配置頭文件 lv_conf_cmsis.h5、配置lv_port_disp_template 四、添加心跳相關文件1、在STM32CubeMX中配置TIM7的參數2、使能…

德思特新聞 | 德思特與es:saar正式建立合作伙伴關系

德思特新聞 2025年5月9日,德思特科技有限公司(以下簡稱“德思特”)與德國嵌入式系統專家es:saar GmbH正式達成合作伙伴關系。此次合作旨在將 es:saar 的先進嵌入式開發與測試工具引入中國及亞太市場,助力本地客戶提升產品開發效率…

fork函數小解

學了好久終于搞懂fork函數的一些作用 1. fork函數作用:用于創建新的子進程 這是fork最根本的功能,在父進程里創建新的子進程、 但是創建新的子進程之后呢? 子進程和父進程的關系是什么樣的? 為什么fork得到的子進程返回值為0&am…

opencv(C++) 變換圖像與形態學操作

文章目錄 使用腐蝕和膨脹圖像形態濾波器實現案例使用形態學濾波器對圖像進行開運算和閉運算實現案例在灰度圖像上應用形態學操作算子形態學梯度(Morphological Gradient)黑帽變換(Black-hat Transform)使用分水嶺算法進行圖像分割使用 MSER 提取顯著區域MSER 檢測與可視化使…

測試工程師學LangChain之promptTemplate 實戰筆記

一、引言:大模型時代的測試自動化革命 2025 年,隨著大模型(如 DeepSeek)在自動化測試領域的廣泛應用,Prompt 編寫已成為測試工程師的核心技能之一。 為什么? 大模型輸出的質量 90% 取決于輸入的 PromptLangChain 的 PromptTemplate 提供了參數化 Prompt 的標準化方案Ope…

CP2K 軟件介紹與使用指南

CP2K 軟件介紹與使用指南 一、CP2K簡介 CP2K是一款開源的量子化學和固態物理模擬軟件包,主要用于原子尺度模擬,特別擅長以下領域: 第一性原理計算:基于密度泛函理論(DFT)的電子結構計算分子動力學(MD):包括從頭算分…

npm、pnpm、yarn使用以及區別

npm 使用 安裝包&#xff1a;在項目目錄下&#xff0c;npm install <包名> 用于本地安裝包到 node_modules 目錄&#xff0c;并添加到 package.json 的 dependencies 中&#xff1b;npm install -g <包名> 用于全局安裝&#xff0c;適用于命令行工具等。初始化項目…

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽復賽CTF部分WP-哥斯拉流量分析

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽復賽CTF部分WP-哥斯拉流量分析 一、流量分析 題目沒有任何提示,附件gzl.pcap 解題哥斯拉流量300多KB包很多,沒啥經驗只能挨個看回來之后又狠狠得擼了一把哥斯拉流量分析我這里用的是哥斯拉4.0.1 測試鏈接…

GitLab 18.0 正式發布,15.0 將不再受技術支持,須升級【六】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

React 項目中封裝 Excel 導入導出組件:技術分享與實踐

文章目錄 前言一、為什么需要封裝 Excel 組件&#xff1f;二、技術選型三、核心實現1. 安裝依賴2. 封裝Excel導出3. 封裝導入組件 &#xff08;UploadExcel&#xff09; 總結 前言 在 React 項目中&#xff0c;處理 Excel 文件的導入和導出是常見的業務需求。無論是導出報表數…

RustDesk 搭建自建服務器并設置服務自啟動

目錄 0. 介紹 1. 事前準備 1.1 有公網 ip 的云服務器一臺 1.2 服務端部署包 1.3 客戶端安裝包 2. 部署 2.1 服務器環境準備 2.2 上傳服務端部署包 2.3 運行 pm2 3. 客戶端使用 3.1 安裝 3.2 配置 3.2.1 解鎖網絡設置 3.2.2 ID / 中級服務器 3.3 啟動效果 > …

基于Qt封裝數據庫基本增刪改查操作,支持多線程,并實現SQLite數據庫單例訪問

抽出來的&#xff0c;直接用就行 頭文件CPP文件使用示例 頭文件 #ifndef DATABASECOMMON_H #define DATABASECOMMON_H/** 單例封裝SQLite通用操作&#xff0c;支持多線程調用&#xff1b;可擴展兼容其他數據庫&#xff0c;照著SysRunDatabase寫&#xff0c;并且重載openDataba…

AI筆記 - 網絡模型 - mobileNet

網絡模型 mobileNet mobileNet V1網絡結構深度可分離卷積空間可分![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 參考 mobileNet V1 網絡結構 MobileNetV1可以理解為VGG中的標準卷積層換成深度可分離卷積 可分離卷積主要有…

第十五篇:MySQL 高級實戰項目:構建高可用、可觀測、性能優化一體化數據庫平臺

本篇聚焦于如何基于 MySQL 構建一個真正面向生產環境的數據庫平臺&#xff0c;集成高可用、可觀測與性能調優三大核心能力&#xff0c;助力穩定、可擴展的系統運行。 一、項目背景與目標 在實際生產環境中&#xff0c;數據庫系統需要應對以下挑戰&#xff1a; 業務高速增長帶來…

華為OD機試真題——文件目錄大小(2025 A卷:100分)Java/python/JavaScript/C++/C語言/GO六種語言最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄+全流程解析/備考攻略/經驗分享 華為OD機試真題《文件目錄大小》: 目錄 題…

qwen 2.5 并行計算機制:依靠 PyTorch 和 Transformers 庫的分布式能力

qwen 2.5 并行計算機制:依靠 PyTorch 和 Transformers 庫的分布式能力 完整可運行代碼: import torch import torch.nn.functional as F from transformers

TIDB創建索引失敗 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.

TIDB創建索引失敗&#xff1a;解決“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”問題 在使用 TIDB 數據庫時&#xff0c;我們有時會遇到創建索引失敗的問題。常見的錯誤信息為&#xff1a; mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…

華為OD機試真題—— 最少數量線段覆蓋/多線段數據壓縮(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄+全流程解析/備考攻略/經驗分享 華為OD機試真題《最少數量線段覆蓋/多線段數…

EasyRTC嵌入式音視頻實時通話SDK助力AI與IoT智能硬件打造音視頻交互多場景應用

一、引言? 在數字化浪潮下&#xff0c;AI與IoT深度融合重塑智能硬件產業。實時音視頻通信是智能硬件交互的核心&#xff0c;其性能關乎用戶體驗與場景拓展。EasyRTC嵌入式音視頻實時通話SDK基于WebRTC技術&#xff0c;以輕量、易擴展的特性&#xff0c;為AI與IoT智能硬件融合…