MySql案例詳解之事務

下面我會從“事務是什么”→“為什么需要事務”→“事務的四大特性(ACID)”→“MySQL中怎么用事務”→“常見坑與調試技巧”→“完整實戰案例(含代碼、輸出、講解)”六個層次,給你一個“看完就能上手”的MySQL事務速查手冊。所有SQL均在MySQL 8.0驗證通過,默認存儲引擎InnoDB。


一、事務是什么?
事務(Transaction)是一組要么全部成功、要么全部失敗的SQL語句集合
典型場景:銀行轉賬——A扣錢、B加錢兩步必須同時成功,否則回滾。


二、為什么需要事務?

  1. 并發場景下避免臟讀、不可重復讀、幻讀
  2. 硬件故障或程序崩潰時保證數據一致性
  3. 業務規則要求“全-or-無”語義

三、ACID 四字口訣

特性解釋MySQL實現機制
原子性 Atomicity全部成功或全部回滾undo log(回滾日志)
一致性 Consistency事務前后數據庫狀態合法(約束、觸發器等)約束+undo/redo
隔離性 Isolation并發事務互不干擾鎖+MVCC
持久性 Durability提交后永久生效redo log(重做日志)+雙寫緩沖

四、MySQL事務語法速查

  1. 基本流程
START TRANSACTION;   -- 或 BEGIN;
-- DML語句1…n
COMMIT;              -- 提交
ROLLBACK;            -- 回滾
  1. 自動提交開關
SELECT @@autocommit;   -- 1表示自動提交,0表示手動
SET autocommit=0;      -- 當前會話關閉自動提交
  1. 保存點(部分回滾)
START TRANSACTION;
SAVEPOINT sp1;
DELETE FROM user WHERE id=1;
SAVEPOINT sp2;
UPDATE user SET money=100 WHERE id=2;
ROLLBACK TO sp2;   -- 只回滾到sp2,保留sp1之前的操作
  1. 隱式提交(陷阱)
    DDL(CREATE/ALTER/DROP)、鎖表、ANALYZE、LOAD DATA等語句會強制提交當前事務

五、隔離級別與并發問題

隔離級別臟讀不可重復讀幻讀加鎖讀語句
READ UNCOMMITTED
READ COMMITTED×Oracle默認
REPEATABLE READ×××*MySQL默認
SERIALIZABLE×××鎖表

*InnoDB通過間隙鎖+MVCC在REPEATABLE READ下也解決了幻讀,因此大多數業務無需跳到SERIALIZABLE。


六、完整實戰:銀行轉賬(含異常回滾演示)

  1. 表結構
CREATE DATABASE IF NOT EXISTS demo_tx;
USE demo_tx;
CREATE TABLE account(id INT PRIMARY KEY,name VARCHAR(20) UNIQUE,money DECIMAL(10,2) NOT NULL CHECK (money>=0)
) ENGINE=InnoDB;INSERT INTO account VALUES
(1,'Alice',1000),
(2,'Bob',1000);
  1. 存儲過程:安全轉賬
DELIMITER $$
CREATE PROCEDURE sp_transfer(IN from_id INT,IN to_id   INT,IN amount  DECIMAL(10,2)
)
BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINROLLBACK;SELECT 'Transfer failed, rolled back!' AS msg;END;START TRANSACTION;-- 1. 檢查余額IF (SELECT money FROM account WHERE id=from_id) < amount THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Insufficient balance';END IF;-- 2. 扣錢UPDATE account SET money = money - amount WHERE id=from_id;-- 3. 加錢UPDATE account SET money = money + amount WHERE id=to_id;COMMIT;SELECT 'Transfer succeeded!' AS msg;
END$$
DELIMITER ;
  1. 測試場景
    | 步驟 | 會話A(正常轉賬) | 會話B(并發讀) | 結果 |
    |—|—|—|—|
    | T1 | CALL sp_transfer(1,2,200); | | Alice:800, Bob:1200 |
    | T2 | | SELECT * FROM account; | 讀到提交后最新值(READ COMMITTED) |
    | T3 | 故意制造異常:扣完錢后插入違反唯一約束 | | 觸發EXIT HANDLER,自動ROLLBACK,雙方余額不變 |

  2. 觀察undo/redo(可驗證)

-- 查看當前活躍事務
SELECT * FROM information_schema.innodb_trx\G-- 查看鎖等待
SELECT * FROM sys.innodb_lock_waits\G

七、常見坑與調試技巧

  1. 忘記COMMIT,導致長事務——SELECT * FROM information_schema.processlist WHERE time>10;
  2. 自動提交=1,START TRANSACTION后仍被隱式提交——用SELECT @@autocommit;確認
  3. DDL打斷事務——把建索引、加字段操作放在業務低峰期
  4. 死鎖——InnoDB自動回滾代價最小的事務;應用層捕獲1213 Deadlock錯誤重試即可
  5. 批量插入性能——用START TRANSACTION; ...bulk inserts... COMMIT;比逐條autocommit快1~2個數量級

八、一句話總結
“BEGIN → 改數據 → 沒問題COMMIT,出問題ROLLBACK”是事務90%的工作量;剩下10%在于選對隔離級別、避免長事務、監控鎖等待。把本文的存儲過程模板復制到測試庫跑一遍,你就擁有了可落地的MySQL事務最佳實踐。

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

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

相關文章

Linux之環境變量(內容由淺入深,層層遞進)

一、概念介紹&#xff08;來源&#xff1a;比特就業課&#xff09;環境變量一般是指在操作系統中用來指定操作系統運行環境的一些參數環境變量通常具有某些特殊用途&#xff0c;并且在系統中通常具有全局特性二、現象引入與解答 1.為什么像ls這樣的系統指令可以直接執行&#x…

監控 Linux 服務器資源

使用 Bash 腳本監控 Linux 服務器資源并發送告警郵件前言一、&#x1f6e0;? 腳本功能概覽二、 &#x1f4dc; 腳本核心邏輯分解2.1. 變量初始化2.2. CPU 使用率監控2.3. 內存使用率監控2.4. 磁盤使用率監控2.5. 磁盤 IO 延遲監控&#xff08;await&#xff09;2.6. 網絡流量監…

隨機獲取數組內任意元素

Math.random() * arr.length 是 JavaScript 中常用的表達式&#xff0c;用于生成一個范圍在 [0, arr.length) 之間的隨機浮點數&#xff08;包含 0&#xff0c;但不包含數組長度本身&#xff09;。 作用說明&#xff1a; Math.random() 生成一個 [0, 1) 區間的隨機浮點數&#…

android studio gradle 訪問不了

1.通過國內鏡像站 2.通過本地部署 參考這個搞定 https://blog.csdn.net/2401_82819685/article/details/144542784

科普:企業微信的第三方應用涉及的“配置應用權限”

企業微信的第三方應用涉及“配置應用權限”&#xff0c;它在不同階段含義不同&#xff1a;開發階段意指應用自身所需的功能權限&#xff0c;安裝階段意指企業管理員對應用使用范圍的控制&#xff0c;產生此歧義的問題&#xff0c;歸根到低還是語言的縮寫問題&#xff0c;設想一…

YOLOv11改進大全:從卷積層到檢測頭,全方位提升目標檢測性能

## 1 引言YOLO&#xff08;You Only Look Once&#xff09;系列作為目標檢測領域的重要算法&#xff0c;以其**高效推理**和**良好精度**贏得了廣泛認可。2024年9月&#xff0c;Ultralytics團隊正式發布了YOLOv11&#xff0c;在先前版本基礎上引入了**多項架構改進**和**訓練優…

JWT全面理解

目錄 一、JWT是什么 1、身份認證&#xff08;最核心用途&#xff09; 2、信息交換 3、授權控制 二、JWT的核心價值 三、如何理解JWT的結構和工作原理 1、三部分結構解析 2、核心工作流程 四、JWT的使用步驟 1、添加依賴 2、添加配置文件 3、創建實體類 4、創建JWT…

量子文件傳輸系統:簡單高效的文件分享解決方案

&#x1f310; 在線體驗地址&#xff1a;https://share-file.narutogis.com/ &#x1f4e4; 項目概述 量子文件傳輸系統是一款基于Python Flask開發的高效文件管理與分享工具&#xff0c;致力于提供簡單、安全、可靠的文件傳輸解決方案。系統支持用戶管理、文件上傳下載、自動…

基于 GitHub Actions 的零成本自動化部署:把 Vite/Vue3 項目一鍵發布到 GitHub Pages 的完整實戰

1. 實現自動化部署1.1. 創建 vue 項目# 1. 安裝/確認 Node.js&#xff08;>14&#xff09; node -v # 推薦 20.x# 2. 創建項目&#xff08;交互式&#xff0c;選 Vue3 Router 等&#xff09; npm init vuelatest github-actions-demo # 創建vite項目 # 或&#xff1a;v…

minio 文件批量下載

MinIO 批量下載功能說明 1. 功能描述 前端勾選多個對象文件后&#xff0c;一次性將這些對象從 MinIO 拉取并打包成 ZIP&#xff0c;通過瀏覽器直接下載。整體特性&#xff1a; 支持跨桶批量下載&#xff08;不同 bucket 的對象可同時下載&#xff09;。服務端采用流式壓縮邊…

機器學習11——特征選擇與稀疏學習

上一章&#xff1a;機器學習10——降維與度量學習 下一章&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備[TOC] 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到…

整理python快速構建數據可視化前端的Dash庫

一.Dash框架# 導入 Dash 相關庫 import dash from dash import dcc, html # dcc 是 Dash 核心組件庫&#xff0c;html 是 HTML 組件庫 from typing import Generic# 創建一個 Dash 應用實例 app dash.Dash(__name__)# 定義應用的布局 app.layout html.Div(children[# 添加一…

RNN循環神經網絡(一):基礎RNN結構、雙向RNN

RNN循環神經網絡 什么是循環神經網絡&#xff1f; 循環神經網絡&#xff08;Recurrent Neural Network, RNN&#xff09;是一類專門用于處理序列數據的神經網絡架構。與傳統的前饋神經網絡不同&#xff0c;RNN具有"記憶"能力&#xff0c;能夠捕捉數據中的時間依賴關系…

#C語言——刷題攻略:牛客編程入門訓練(十):攻克 循環控制(二),輕松拿捏!

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題合集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"代碼行數決定你的下限&#xff0c;算法思維決定你的上限。" 目錄 1. BC82 乘法表…

daily notes[16]

文章目錄意大利語單詞 **“bello”**一、核心含義二、變形規則&#xff1a;最重要的部分1. 當 “bello” 位于 **名詞前面** 時2. 當 “bello” 位于 **名詞后面** 或 **動詞后面** 時三、用法總結與對比四、其他用法和常見表達references意大利語單詞 “bello” 融合了 指示形…

【知識庫】計算機二級python操作題(二)

文章目錄基本操作題1基本操作題2基本操作題3簡單應用題1簡單應用題2綜合應用題1基本操作題1考生文件夾下存在一個文件PY101.py&#xff0c;請寫代碼替換橫線&#xff0c;不修改其他代碼&#xff0c;實現以下功能&#xff0c;隨機選擇一個手機品牌屏幕輸出。 # 請在...處使用一行…

Nginx 服務用戶與防盜鏈配置

目錄 Nginx 服務用戶與防盜鏈配置 1. 隱藏版本號 1.1 配置方法 1.2 生效與驗證 2. 修改當前程序賬號 2.1 操作步驟 3. 緩存時間 3.1 配置方法 3.2 說明 4. 日志分割 4.1 實現方式&#xff08;腳本自動分割&#xff09; 5. 連接超時時間 5.1 核心超時指令&#xff0…

域格4G模塊通信協議之HTTP(三):下載大文件的兩種方式

域格ASR系列模塊支持HTTP下載大文件&#xff0c;本文將提供兩種方式。一、直接通過URC上報數據基礎操作核心指令說明配置說明響應說明應用示例注意點二、HTTP Range分段下載核心指令說明注意點一、直接通過URC上報數據 若文件體積適中&#xff0c;且需要 MCU 即時處理數據&…

Android 圖片 OOM 防護機制設計:大圖加載、內存復用與多級緩存

1. 為什么圖片加載總讓 Android 開發抓狂? 圖片是 Android 應用中不可或缺的元素,從用戶頭像到高清壁紙,從商品詳情頁到動態表情包,圖片無處不在。然而,圖片加載是內存管理的雷區,稍不留神就可能觸發臭名昭著的 OutOfMemoryError(OOM)。為啥圖片這么“吃內存”?原因很…