详解MySQL事务(transaction),用图直观解释了MySQL脏读、不可重复读、幻读的问题
事务
事务是一组操作的集合,会把所有操作作为一个整体去执行,要么同时成功,要么同时失败。
事务操作
- 查看/设置事务提交方式
SELECT @@autocommit; # 1为自动,0为手动
SET @@autocommit = 0; # 改手动提交
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
- 开启事务
START TRANSACTION 或 BEGIN;
事务的四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变是永久的。
并发事务问题
- 脏读:一个事务读到另外一个事务还有没提交的数据。
- 不可重复读:一个事务先读取同一条记录,但两次读取的数据不同。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。
事务的隔离级别
- Read uncommitted
- 可发生 脏读、不可重复读、幻读
- Read committed
- 可发生 不可重复读、幻读
- Repeatable Read(默认)
- 可发生 幻读
- Serializable
- 隔离级别最高,不会发生
# 查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
# 设置事务隔离级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
隔离等级为Read uncommitted,发生脏读的例子
脏读:一个事务读到另外一个事务还有没提交的数据。
隔离等级为Read committed,发生不可重复读的例子
不可重复读:一个事务先读取同一条记录,但两次读取的数据不同。
-
image
-
代码运行图及结果:
隔离等级为Repeatable Read(默认),发生幻读的例子
-
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。
-
image
-
代码运行图及结果:
隔离等级为Serializable
隔离等级为Serializable,只允许一个事务进行操作,只有当这个执行的事务操作完成后,才会去执行其他事务,从而避免了 脏读、不可重复读、幻读 问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具