7人参与 • 2026-03-19 • Mysql
你想知道 mysql 的默认事务隔离级别,这是理解 mysql 并发控制、解决脏读 / 幻读 / 不可重复读等问题的核心知识点。我会从「默认值」「隔离级别分类」「原理验证」「修改方法」四个维度详细讲解,让你不仅知其然,更知其所以然。
repeatable read(可重复读);read committed)的核心区别之一。你可以直接在 mysql 客户端执行以下命令,查看当前默认隔离级别:
-- 查看全局/会话级别的默认隔离级别 select @@global.transaction_isolation, @@session.transaction_isolation; -- 旧版本(mysql 5.6及之前)用这个命令 select @@global.tx_isolation, @@session.tx_isolation;
输出示例:
| @@global.transaction_isolation | @@session.transaction_isolation |
|---|---|
| repeatable-read | repeatable-read |
sql 标准定义了 4 种事务隔离级别,mysql innodb 全部支持,级别从低到高如下(隔离性越强,并发性能越差):
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 核心说明 |
|---|---|---|---|---|
| read uncommitted(读未提交) | ✅ | ✅ | ✅ | 最低级别,能读取其他事务未提交的数据,会导致脏读 |
| read committed(读已提交) | ❌ | ✅ | ✅ | 只能读取其他事务已提交的数据,解决脏读,但仍有不可重复读 / 幻读 |
| repeatable read(可重复读) | ❌ | ❌ | ❌ | mysql 默认,同一事务内多次读取同一数据结果一致,innodb 额外解决了幻读 |
| serializable(串行化) | ❌ | ❌ | ❌ | 最高级别,事务串行执行,完全解决并发问题,但性能极差(几乎不用于生产) |
age=20的用户有 10 个,事务 b 插入 1 条age=20的记录并提交,a 再查就变成 11 个,像 “幻觉”)。innodb 的repeatable read之所以能同时解决不可重复读和幻读,核心依赖两个机制:
repeatable read级别下,会对索引记录之间的 “间隙” 加锁,防止其他事务插入数据,从而额外解决了幻读(这是 mysql 对 sql 标准的增强);select * from user where age = 20 for update,innodb 会锁定age=20的记录,以及age在 19-21 之间的间隙,阻止插入新的age=20的记录。-- 设置当前会话的隔离级别为读已提交 set session transaction_isolation = 'read-committed'; -- 验证修改结果 select @@session.transaction_isolation;
编辑 mysql 配置文件(my.cnf/my.ini):
[mysqld] # 设置全局默认隔离级别为读已提交 transaction-isolation = read-committed
重启 mysql 服务:
# linux systemctl restart mysqld # windows net stop mysql && net start mysql
验证全局配置:
select @@global.transaction_isolation;
-- 开启事务前设置 set transaction isolation level read committed; start transaction; -- 事务内的操作使用读已提交级别 select * from user where age = 20; commit;
| 隔离级别 | 适用场景 | 优缺点 |
|---|---|---|
| repeatable read | 绝大多数业务场景(电商、后台管理系统等) | 平衡隔离性和并发性能 |
| read committed | 高并发写场景(如金融交易)、兼容 oracle 业务 | 并发性能更好,仅解决脏读 |
| serializable | 数据一致性要求极高的场景(如对账、审计) | 一致性最好,并发性能极差 |
repeatable read(可重复读),这是平衡隔离性和并发性能的最优选择;set session/global临时 / 全局修改,或修改配置文件永久生效,按需适配业务场景。到此这篇关于深入理解mysql默认事物隔离级别的文章就介绍到这了,更多相关mysql默认事物隔离级别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论