
前言
上一篇《数据库篇 16》中,我们已经掌握了标量、列、行、表四种子查询的用法,学会了如何将复杂查询分解为多个简单步骤。本篇作为数据库篇的第十七篇,我们将学习数据库中最核心的并发控制机制——事务。事务是保证数据一致性和完整性的基础,解决了多操作并发执行时的数据安全问题,是所有涉及资金交易、订单处理等核心业务的必备技能。
本文为Python全栈开发者与数据库入门者量身打造,从最经典的银行转账案例入手,深入浅出地讲解事务的概念、操作语法和四大核心特性,每一个知识点都有可直接运行的实战示例,同时重点标注生产环境中的常见陷阱和最佳实践,即使是完全没有并发编程经验的同学,也能快速掌握事务的核心用法。
本节核心学习内容:
文章目录
- 前言
- 一、事务简介
-
- 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元,这个操作包含两个步骤:
如果没有事务,当第一步执行成功后,第二步执行失败(比如服务器宕机),就会出现"张三扣了钱,李四没收到钱"的严重数据不一致问题。而事务可以保证这两个步骤要么都成功,要么都失败,不会出现中间状态。
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事务速查表
为了方便后续开发时快速查阅,整理了事务操作和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


