MariaDB 10.5 与 MySQL 8.0 在事务隔离级别上有什么具体区别?

文章导读
从 MySQL 8.0 和 MariaDB 10.2 起,两者在事务隔离实现上差异逐渐扩大,但默认隔离级别均保持为 REPEATABLE READ。
📋 目录
  1. 原因分析
  2. 存储引擎差异对事务的影响
  3. 具体功能差异对比
  4. 查看和设置隔离级别的方法
  5. 注意事项
  6. 参考来源
A A

MariaDB 10.5 与 MySQL 8.0 在事务隔离级别上有什么具体区别?

核心结论:从 MySQL 8.0 和 MariaDB 10.2 起,两者在事务隔离实现上差异逐渐扩大,但默认隔离级别均保持为 REPEATABLE READ。

原因分析

MariaDB 是 MySQL 源代码的一个分支,主要由开源社区维护,采用 GPL 授权。两者在 5.5/5.6 时代几乎完全兼容,但从 MySQL 8.0 和 MariaDB 10.2 起,差异逐渐扩大。在存储引擎方面,MariaDB 10.1 版本使用 Percona XtraDB 来代替 MySQL 的 InnoDB,XtraDB 是 InnoDB 存储引擎的增强版。在 MariaDB 10.3.7 和更高的版本中,使用的是 InnoDB,但它的实现与 MySQL 中的 InnoDB 有很大的不同。

事务隔离级别方面,MySQL 和 MariaDB 都支持四种标准隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读,默认级别)、SERIALIZABLE(串行化)。两者的默认隔离级别都是 REPEATABLE READ,但在底层锁机制和 MVCC 实现上存在差异。

存储引擎差异对事务的影响

MariaDB 从 5.1 版本开始,就默认使用 XtraDB 存储引擎。相较于 InnoDB,XtraDB 具有更多的特性、参数指标和扩展功能。从实践的角度来看,在 CPU 多核的条件下,XtraDB 能够更有效地使用内存,并且性能更高。

但是,随着技术的更新,InnoDB 又迎头赶上来了。MariaDB 从 10.2 版本开始,对基于 MySQL 5.7 的 InnoDB 进行了大幅度的改进。在 MariaDB 10.3.7 和更高的版本中,使用的是 InnoDB,它的实现与 MySQL 中的 InnoDB 有很大的不同。在这些版本中,InnoDB 不再与 MySQL 发行版本相关联。

具体功能差异对比

根据知识库记录,MariaDB 中的 InnoDB 存储引擎与 MySQL 中存在如下差异:

MariaDB 10.5 与 MySQL 8.0 在事务隔离级别上有什么具体区别?

1)MariaDB 10.1(基于 MySQL 5.6 版本)在 MySQL 5.7 版本发布之前就已经实现了 InnoDB 存储引擎加密。

2)MariaDB 10.2(基于 MySQL 5.7 版本)在 MySQL 8.0 GA 发行版之前就已经引入了持久性 auto_increment,即 MySQL 重启后,该值不再丢失。

例如,有一道经典面试题:一张 InnoDB 表里面包含了 ID 自增主键,在向表中插入 17 条记录之后,删除第 15~17 条记录,然后重启 mysqld 服务进程,再向该表中插入一条记录。答案是在 MySQL 5.7 及更早版本中,该记录的 ID 是 15。在 MySQL 8.0 版本中,该记录的 ID 是 18。

查看和设置隔离级别的方法

在 MySQL 8.0.27 版本中,可以通过以下方式查看当前事务隔离级别:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+

设置事务隔离级别的语法:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;

# 隔离级别 level:
# REPEATABLE READ    # 可重复读
# READ COMMITTED     # 读已提交
# READ UNCOMMITTED   # 读未提交
# SERIALIZABLE       # 串行化

示例:设置全局事务隔离级别为串行化,后续所有事务生效,不影响当前事务:

MariaDB 10.5 与 MySQL 8.0 在事务隔离级别上有什么具体区别?
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

设置会话事务隔离级别为串行化,当前会话后续的所有事务生效:

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

注意事项

1. 事务隔离级别越高,为避免冲突所花费的性能也就越多。采用哪种隔离级别要根据系统需求权衡决定。

2. 在可重复读级别,实际上可以解决部分的幻读问题,但是不能防止 UPDATE 更新产生的幻读问题,要禁止幻读产生,还是需要设置串行化隔离级别。

3. MariaDB 与 MySQL 的绝大多数功能都是兼容的,前端应用(比如 PHP、Perl、Python、Java、Golang、.NET、MyODBC、Ruby)几乎感觉不到两者之间有什么不同之处。

4. 移植 XtraDB 是一项非常复杂的任务,会延迟版本的发布周期,因此 MariaDB 又与 Percona XtraDB 分道扬镳了。

MariaDB 10.5 与 MySQL 8.0 在事务隔离级别上有什么具体区别?

5. 目前公开资料中未找到关于 MariaDB 10.5 与 MySQL 8.0 在事务隔离级别性能对比的具体百分比数据。

参考来源

来源:知识库 - MariaDB 和 MySQL 的主要区别是什么(时间戳 2025 年 11 月 23 日)

来源:知识库 - MySQL 运维进阶指南(撰于 2025 年 1 月 23 日)

来源:知识库 - 跑了 4 个实验,实战讲解 MySQL 的行锁、间隙锁(搜索结果收录于 2021 年 12 月 13 日,MySQL 8.0.27 版本)

来源:知识库 - 数据库造神计划第十九天---事务 (2)(2025 年 12 月 17 日的资料)