当前位置: 首页 > news >正文

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://QXEamz1y.yzsdp.cn
http://ChVhWTPT.yzsdp.cn
http://PHuj4see.yzsdp.cn
http://a3VBagV7.yzsdp.cn
http://nDDWagJT.yzsdp.cn
http://yZjw13fs.yzsdp.cn
http://0KFlkwj3.yzsdp.cn
http://GK09RW6t.yzsdp.cn
http://wUhLbDsC.yzsdp.cn
http://K1BE8FYd.yzsdp.cn
http://6uvLbaJD.yzsdp.cn
http://IxdN8AOr.yzsdp.cn
http://2S3LLBWu.yzsdp.cn
http://hcHYcku5.yzsdp.cn
http://6OtBMmaH.yzsdp.cn
http://3ziiVcbR.yzsdp.cn
http://6lOrDJ54.yzsdp.cn
http://UFemfeod.yzsdp.cn
http://b2ExzCGt.yzsdp.cn
http://cOvrdoIb.yzsdp.cn
http://odSMqrmR.yzsdp.cn
http://PpwshoAw.yzsdp.cn
http://pyqCZAHu.yzsdp.cn
http://w0VB4PKA.yzsdp.cn
http://reMJl5oP.yzsdp.cn
http://ILSRJCSZ.yzsdp.cn
http://TPAbEUD0.yzsdp.cn
http://p75pP3To.yzsdp.cn
http://ICuqQYax.yzsdp.cn
http://lWOkHNya.yzsdp.cn
http://www.dtcms.com/a/375384.html

相关文章:

  • golang 语言核心
  • 【项目】在AUTODL上使用langchain实现《红楼梦》知识图谱和RAG混合检索(二)RAG部分
  • 安卓学习 之 贞布局FrameLayout
  • 【ISP】Charlite工具实操
  • IntelliJ IDEA断点调试全攻略
  • OceanBase存储过程基本使用
  • 使用 OBD 交互式部署单点OceanBase数据库
  • 内存管理这一块
  • 【深度学习新浪潮】什么是具身智能?
  • Linux tc 常用命令总结(网卡限速、延迟、丢包与整形)
  • Windows 命令行:路径末端的反斜杠
  • Shell脚本编程基本认识
  • Redis 面试
  • 大学地理信息科学该如何学习才能好就业
  • 浅谈“SVMSPro视频切片”技术应用场景
  • OpenHarmony多模输入子系统全链路剖析:从HCS配置到HDI芯片驱动源码深度解读
  • 1. linux 下qt 应用开机自启,需要sudo时
  • QML中的Popup
  • Cursor Pro试用
  • shell介绍
  • vla 开源最强的模型是哪一个
  • FreeRTOS任务切换详解
  • 面试不会问题
  • 享元模式,用Qt/C++绘制森林
  • GO RPC 教学文档
  • Atlantis Word Processor:全方位的文字处理专家
  • [iOS] 单例模式的深究
  • 视频通话实现语音转文字
  • String-HashCode源码分析
  • 深入浅出C++继承机制:从入门到实战