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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)。为啥图片这么“吃内存”?原因很…