欢迎光临
我们一直在努力

Python全栈入门到实战【数据库篇 17】MySQL事务详解,数据一致性与并发安全的核心保障

在这里插入图片描述

前言

上一篇《数据库篇 16》中,我们已经掌握了标量、列、行、表四种子查询的用法,学会了如何将复杂查询分解为多个简单步骤。本篇作为数据库篇的第十七篇,我们将学习数据库中最核心的并发控制机制——事务。事务是保证数据一致性和完整性的基础,解决了多操作并发执行时的数据安全问题,是所有涉及资金交易、订单处理等核心业务的必备技能。

本文为Python全栈开发者与数据库入门者量身打造,从最经典的银行转账案例入手,深入浅出地讲解事务的概念、操作语法和四大核心特性,每一个知识点都有可直接运行的实战示例,同时重点标注生产环境中的常见陷阱和最佳实践,即使是完全没有并发编程经验的同学,也能快速掌握事务的核心用法。

本节核心学习内容:

  • 事务概述:核心概念与经典应用场景
  • 事务操作:两种事务管理方式与完整语法
  • 事务四大特性(ACID):原子性、一致性、隔离性、持久性详解
  • 完整实战:银行转账的事务实现(成功提交与异常回滚)
  • 常见误区:自动提交、DDL事务、长事务等避坑指南
  • 核心总结:事务操作语法速查表与ACID特性总结
  • 文章目录

    • 前言
    • 一、事务简介
      • 1.1 什么是事务
      • 1.2 经典应用场景:银行转账
      • 1.3 MySQL的默认事务行为
    • 二、事务操作
      • 2.1 方式一:修改自动提交方式
        • 语法格式
        • 实战示例
      • 2.2 方式二:手动开启事务(推荐使用)
        • 语法格式
        • 实战示例
    • 三、事务四大特性(ACID)
      • 3.1 原子性(Atomicity)
      • 3.2 一致性(Consistency)
      • 3.3 隔离性(Isolation)
      • 3.4 持久性(Durability)
    • 四、完整实战演示:银行转账事务
      • 4.1 准备测试数据
      • 4.2 正常转账(事务提交)
      • 4.3 异常转账(事务回滚)
    • 五、常见误区与避坑指南
    • 六、核心总结:MySQL事务速查表
      • 事务操作语法速查表
      • ACID特性总结
    • 七、专栏订阅

    一、事务简介

    1.1 什么是事务

    事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

    1.2 经典应用场景:银行转账

    最经典的事务场景就是银行转账:张三给李四转账1000元,这个操作包含两个步骤:

  • 张三的账户余额减去1000元
  • 李四的账户余额加上1000元
  • 如果没有事务,当第一步执行成功后,第二步执行失败(比如服务器宕机),就会出现"张三扣了钱,李四没收到钱"的严重数据不一致问题。而事务可以保证这两个步骤要么都成功,要么都失败,不会出现中间状态。

    1.3 MySQL的默认事务行为

    默认情况下,MySQL的事务是自动提交的。也就是说,当执行一条DML(INSERT/UPDATE/DELETE)语句时,MySQL会立即隐式地提交事务,这条语句的修改会永久生效。

    二、事务操作

    MySQL提供了两种管理事务的方式:

  • 修改自动提交方式,关闭自动提交后,所有操作都需要手动提交或回滚
  • 手动开启事务,在事务内执行操作,最后手动提交或回滚
  • 2.1 方式一:修改自动提交方式

    语法格式

    — 查看当前事务提交方式(1表示自动提交,0表示手动提交)
    SELECT @@autocommit;

    — 设置为手动提交事务
    SET @@autocommit = 0;

    — 提交事务
    COMMIT;

    — 回滚事务
    ROLLBACK;

    实战示例

    — 1. 查看当前自动提交状态
    SELECT @@autocommit; — 默认返回1

    — 2. 设置为手动提交
    SET @@autocommit = 0;

    — 3. 执行转账操作
    UPDATE account SET money = money – 1000 WHERE name = '张三';
    UPDATE account SET money = money + 1000 WHERE name = '李四';

    — 4. 提交事务(所有修改永久生效)
    COMMIT;

    — 5. 如果执行过程中出错,回滚事务(所有修改撤销)
    ROLLBACK;

    2.2 方式二:手动开启事务(推荐使用)

    这种方式不会改变全局的自动提交设置,只对当前会话的本次事务有效,是生产环境推荐使用的方式。

    语法格式

    — 开启事务
    START TRANSACTION;
    — 或者
    BEGIN;

    — 提交事务
    COMMIT;

    — 回滚事务
    ROLLBACK;

    实战示例

    — 1. 开启事务
    BEGIN;

    — 2. 执行转账操作
    UPDATE account SET money = money – 1000 WHERE name = '张三';
    UPDATE account SET money = money + 1000 WHERE name = '李四';

    — 3. 提交事务
    COMMIT;

    — 4. 异常情况回滚
    — BEGIN;
    — UPDATE account SET money = money – 1000 WHERE name = '张三';
    — — 模拟出错,第二条语句没有执行
    — ROLLBACK;

    三、事务四大特性(ACID)

    事务具有四个核心特性,简称ACID,这是所有关系型数据库事务的标准,也是面试的高频考点。

    3.1 原子性(Atomicity)

    事务是不可分割的最小操作单元,事务中的所有操作要么全部成功,要么全部失败。

    • 成功:所有操作都执行完成,修改永久生效
    • 失败:任何一个操作失败,已经执行的操作都会被回滚,回到事务开始前的状态

    3.2 一致性(Consistency)

    事务完成时,必须使所有的数据都保持一致状态。

    在转账例子中,一致性保证了转账前后两个账户的总金额不变。如果转账前张三有2000元,李四有2000元,总金额4000元;转账后张三有1000元,李四有3000元,总金额仍然是4000元。

    3.3 隔离性(Isolation)

    数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

    多个事务并发执行时,一个事务的修改不应该影响其他事务的执行。例如,张三给李四转账的同时,王五也给李四转账,这两个事务应该互不干扰,最终李四的账户余额应该是两次转账的总和。

    3.4 持久性(Durability)

    事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

    即使数据库发生崩溃或重启,已经提交的事务修改也不会丢失,因为修改已经被写入到磁盘的持久化存储中。

    四、完整实战演示:银行转账事务

    下面我们通过一个完整的案例,演示事务的使用,包括正常提交和异常回滚两种情况。

    4.1 准备测试数据

    — 创建账户表
    CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '账户ID',
    name VARCHAR(20) NOT NULL UNIQUE COMMENT '账户名',
    money DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '账户余额'
    ) COMMENT '账户表';

    — 插入测试数据
    INSERT INTO account(name, money) VALUES ('张三', 2000.00), ('李四', 2000.00);

    — 查看初始数据
    SELECT * FROM account;

    4.2 正常转账(事务提交)

    — 开启事务
    BEGIN;

    — 执行转账操作:张三给李四转账1000元
    UPDATE account SET money = money – 1000 WHERE name = '张三';
    UPDATE account SET money = money + 1000 WHERE name = '李四';

    — 提交事务
    COMMIT;

    — 查看转账后的数据
    SELECT * FROM account;
    — 结果:张三1000.00,李四3000.00

    4.3 异常转账(事务回滚)

    — 先恢复数据
    UPDATE account SET money = 2000.00;

    — 开启事务
    BEGIN;

    — 执行第一步:张三扣钱
    UPDATE account SET money = money – 1000 WHERE name = '张三';

    — 模拟异常:此时服务器宕机,第二步没有执行
    — UPDATE account SET money = money + 1000 WHERE name = '李四';

    — 回滚事务,撤销张三的扣钱操作
    ROLLBACK;

    — 查看回滚后的数据
    SELECT * FROM account;
    — 结果:张三2000.00,李四2000.00,数据没有被破坏

    五、常见误区与避坑指南

  • 自动提交的陷阱:MySQL默认自动提交事务,单条DML语句执行后会立即生效,无法回滚。如果需要执行多条相关操作,必须手动开启事务。
  • DDL语句不能回滚:CREATE、ALTER、DROP等DDL语句会隐式提交事务,执行后无法回滚。因此在执行DDL语句前一定要谨慎。
  • 长事务的危害:长事务会占用数据库资源,导致锁等待和性能下降,甚至引发数据库死锁。事务应该尽量短小,只包含必要的业务操作。
  • 回滚的范围:ROLLBACK只能回滚当前事务中未提交的修改,已经提交的修改无法回滚。
  • 事务的隔离级别:MySQL默认的隔离级别是可重复读(REPEATABLE READ),不同的隔离级别会影响并发事务的行为,后续文章会详细讲解。
  • 六、核心总结:MySQL事务速查表

    为了方便后续开发时快速查阅,整理了事务操作和ACID特性的核心速查表:

    事务操作语法速查表

    操作语法说明
    查看自动提交 SELECT @@autocommit; 1表示自动提交,0表示手动提交
    设置自动提交 SET @@autocommit = 0; 0为手动提交,1为自动提交
    开启事务 BEGIN; 或 START TRANSACTION; 推荐使用,不影响全局设置
    提交事务 COMMIT; 所有修改永久生效
    回滚事务 ROLLBACK; 撤销所有未提交的修改

    ACID特性总结

    特性英文核心含义
    原子性 Atomicity 不可分割,要么全成功,要么全失败
    一致性 Consistency 事务前后数据状态一致
    隔离性 Isolation 并发事务之间互不干扰
    持久性 Durability 提交后修改永久生效

    七、专栏订阅

    • 专栏优点?《Python从入门到实战》,专栏内容涵盖:Python基础到高级编程、并发编程(进程/线程/协程)、网络编程(TCP/UDP/Socket)、核心内置/第三方模块、数据库核心实战、Web开发(Django/Flask/FastAPI框架)、数据库(MySQL/ORM/异步数据库)、网络爬虫(同步/异步/分布式)、AI实战、Linux部署运维等全栈核心知识,以项目驱动教学,构建清晰学习路径,适合零基础入门和进阶提升的同学,跟着一步步从入门到精通!专栏地址:https://blog.csdn.net/zsh_1314520/category_13108073.html
    • 文章是永久吗? 一次订阅后可永久免费查看专栏内所有文章,后续会持续更新全栈相关内容,第一时间获取最新教程!
    • 有答疑交流群吗? 订阅专栏后有专属的全栈学习答疑群,群内提供专业问题答疑、和众多学习者抱团取暖,一起沉淀技术、赋能成长!
    • 进群方式? 订阅专栏后可直接在专栏内申请加入答疑群,或私信博主沟通进群事宜:https://bbs.csdn.net/topics/620104702
    • 更多干货? 点赞+收藏+关注博主不迷路!博主博客链接:https://blog.csdn.net/zsh_1314520?spm=1000.2115.3001.5343,专注Python全栈技术分享,评论区留言问题会一一回复,助力大家轻松搞定Python全栈!

    【原创声明】 除本文原文地址以外,如发现同款内容皆为盗版,本文已收录于《Python全栈:从入门到实战》,请勿购买盗版文章和专栏,如购买盗版内容不提供任何服务。原文地址:https://blog.csdn.net/zsh_1314520/article/details/163373603

    赞(0)
    未经允许不得转载:171主机测评 » Python全栈入门到实战【数据库篇 17】MySQL事务详解,数据一致性与并发安全的核心保障
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址