黑都精通的MySQL技能,数据库隔离级别你掌握了吗?
- 内容介绍
- 文章标签
- 相关推荐
大家好, 我是
你猜怎么着? 今天借着黑神话的热度,跟大家分享一下数据库隔离级别也是面试必备的八股文

又爱又恨。 最近狗哥这当面试官的频率越来越多,面试者的水平也参差不齐...
关于数据库隔离级别的问题也是五花八门,有的小伙伴说这完全是八股文,没有实际作用
我跟你交个底... 但狗哥作为搬砖编码小王子,认为基础内容必须掌握,不只为了应付面试,而是提升自己的必经道路
遂狗哥数据库隔离级别全攻略与小伙伴一起分享这个知识点
一、什么是数据库隔离级别?
如果多个事务一边修改数据,可能会出现数据不一致的情况。数据库隔离级别就是用来控制事务之间相互影响程度的机制。 对吧,你看。 它决定了事务在施行过程中与其他事务施行后来啊之间的关系。
二、 MySQL 的五种隔离级别
MySQL 提供了五种事务隔离级别:
- **READ UNCOMMITTED **:最低级别的隔离;允许读取其他事务尚未提交的数据;性能最高,但数据平安风险最大。
- **READ COMMITTED **:允许读取其他事务已提交的数据;防止脏读;可能发生不可重复读和幻读。
- **REPEATABLE READ **:默认级别;保证在同一事务内多次读取同一数据时后来啊一致;防止不可重复读;可能发生幻读。
- **SERIALIZABLE **:最高级别的隔离;将每个事务视为串行施行的过程;完全防止脏读、不可重复读和幻读;性能最低。
三、详细讲解各隔离级别
1. READ UNCOMMITTED
- 名词解释: 允许一个事务读取另一个事务尚未提交的数据。
- 示例: 想象你在银行排队等待办理业务。你的朋友正在柜台办理转账还没提交的话你可以查余额到朋友转账前的值。主要原因是你查到了对方还没提交的状态下的余额, 这就是脏读.
- 特点: 数据不一致风险最高, 性能最好.
- 名词解释: 只能读取其他事务已经提交的数据.
- 示例: 你在网上购物查看商品价格, 然后去喝咖啡回来又查看了相同的商品价格, 如果商品价格已经发生了变化, 这个就属于不可重复读现象.
- 特点: 防止脏写, 但可能发生不可重复读和幻数.
3. REPEATABLE READ
- 名词解释: 在同一个会话中对同一行进行多次读取, 后来啊一致.
- 示例: 你在一个图书馆查找书籍, 先找到10本书子编程的书籍, 然后离开去喝咖啡回来后 查询发现有12本编程书籍的原因是别的读者捐赠了两本书子到图书馆中来. 这就是幻数现象.
- 特点: 防止不可重复写和幻数, 但依然存在幻数问题.
4. SERIALIZABLE
- 名词解释: 将每个事务所视为串行施行过程; 完全防止脏写、 不可重复写和幻数; 这是最平安的选项, 但也会降低系统并发性能; 如果需要完全避免并发冲突的话可以选择这个设置; 如果并发性能很重要可以考虑别的选项设置;
四、如何设置 MySQL 的隔离级别?
可以通过以下两种方式设置 MySQL 的隔离级别:,太魔幻了。
- 全局设置 修改配置文件中的 `transaction_isolation` 参数。
比方说:
transaction_isolation=READ-COMMITTED需要重启 MySQL 服务才能生效。此方式会影响所有连接到数据库的客户端。注意配置文件位置不同会导致不同的生效方式及效果不一样 . 下图展示不同操作系统下对应的配置路径及常见参数说明 :操作系统 配置文件路径 参数 说明 Linux /etc/mysql/my.cnf transaction_isolation 全局设置交易隔离级别 Linux /usr/local/mysql/my.cnf transaction_isolation 全局设置交易隔离级别 Windows C:\ProgramData\MySQL\MySQL Server \my.ini transaction_isolation 全局设置交易隔离级别 macOS /usr/local/mysql/support-files/my-default.cnf transaction_isolation 全局设置交易隔离级别或者 /opt/ /support-files/...
SET GLOBAL transactionisolation = READ COMMITTED; 或者SET SESSION transactionisolation = REPEATABLE READ; 此方法只影响当前会话或连接 , 修改完成后会自动恢复为上次配置值.
此命令在客户端运行后生效 , 但是如果不重启客户端或者连接则无效 . 下图展示不同客户端下操作方式 :
| 客户端 | 操作方式 | 说明 |
|---|---|---|
| MySQL Shell or mysql client CLI tool | 使用SET GLOBAL or SET SESSION命令修改当前会话的全局或会话的变量值 . 具体参考上面例子说明 . |
五、实际应用示例
| 场景 | 适用隔离级别 | 原因 |
|---|---|---|
| 电商网站商品库存管理 | REPEATABLE READ 或 SERIALIZABLE | 确保同一时刻对同一商品信息的操作后来啊一致性; 防止因并发修改导致库存错误等问题. . 高并发场景下尽量选择可重复读取来保证数据的准确性 ; 低并发场景下选择SERIALIZABLE 可以保证绝对的数据一致性 , 但也会牺牲一定的性能 。 如果对数据的一致性要求极高且业务量不大则选择SERIALIZABLE ; 反之则可考虑较低级别的规则 。 下面举例说明 : 一个电商网站统计某个商品的销量 , 该统计后来啊应该是一致的 ; 主要原因是如果多个线程一边计算销量 , 但是每次计算的后来啊都不一样会导致错误的决策 ; 所以可以使用SERIALIZABLE 来确保统计后来啊的一致性 。 但是如果该商品的销量统计不是关键性的信息, 则可以使用REPEATABLE READ 来提高系统吞吐量 。 一些在线游戏中的角色属性更新 , 可以使用READ COMMITTED 或者 REPEATABLE READ 来提高系统的响应速度 。 在一些重要的金融交易中建议使用 SERIALIZABLE 来确保绝对的数据一致性和平安性 。 |
| 银行转账系统 | ||
| 视频点播系统播放进度同步 | REPEATABLE READ 或 SERIALIZABLE 如果实时性要求不高, 可优先考虑降低复杂度以提高响应速度 . 如果需要保证实时同步效果, 则需要选择更高的原子性和一致性级别的规则 . |
大家好, 我是
你猜怎么着? 今天借着黑神话的热度,跟大家分享一下数据库隔离级别也是面试必备的八股文

又爱又恨。 最近狗哥这当面试官的频率越来越多,面试者的水平也参差不齐...
关于数据库隔离级别的问题也是五花八门,有的小伙伴说这完全是八股文,没有实际作用
我跟你交个底... 但狗哥作为搬砖编码小王子,认为基础内容必须掌握,不只为了应付面试,而是提升自己的必经道路
遂狗哥数据库隔离级别全攻略与小伙伴一起分享这个知识点
一、什么是数据库隔离级别?
如果多个事务一边修改数据,可能会出现数据不一致的情况。数据库隔离级别就是用来控制事务之间相互影响程度的机制。 对吧,你看。 它决定了事务在施行过程中与其他事务施行后来啊之间的关系。
二、 MySQL 的五种隔离级别
MySQL 提供了五种事务隔离级别:
- **READ UNCOMMITTED **:最低级别的隔离;允许读取其他事务尚未提交的数据;性能最高,但数据平安风险最大。
- **READ COMMITTED **:允许读取其他事务已提交的数据;防止脏读;可能发生不可重复读和幻读。
- **REPEATABLE READ **:默认级别;保证在同一事务内多次读取同一数据时后来啊一致;防止不可重复读;可能发生幻读。
- **SERIALIZABLE **:最高级别的隔离;将每个事务视为串行施行的过程;完全防止脏读、不可重复读和幻读;性能最低。
三、详细讲解各隔离级别
1. READ UNCOMMITTED
- 名词解释: 允许一个事务读取另一个事务尚未提交的数据。
- 示例: 想象你在银行排队等待办理业务。你的朋友正在柜台办理转账还没提交的话你可以查余额到朋友转账前的值。主要原因是你查到了对方还没提交的状态下的余额, 这就是脏读.
- 特点: 数据不一致风险最高, 性能最好.
- 名词解释: 只能读取其他事务已经提交的数据.
- 示例: 你在网上购物查看商品价格, 然后去喝咖啡回来又查看了相同的商品价格, 如果商品价格已经发生了变化, 这个就属于不可重复读现象.
- 特点: 防止脏写, 但可能发生不可重复读和幻数.
3. REPEATABLE READ
- 名词解释: 在同一个会话中对同一行进行多次读取, 后来啊一致.
- 示例: 你在一个图书馆查找书籍, 先找到10本书子编程的书籍, 然后离开去喝咖啡回来后 查询发现有12本编程书籍的原因是别的读者捐赠了两本书子到图书馆中来. 这就是幻数现象.
- 特点: 防止不可重复写和幻数, 但依然存在幻数问题.
4. SERIALIZABLE
- 名词解释: 将每个事务所视为串行施行过程; 完全防止脏写、 不可重复写和幻数; 这是最平安的选项, 但也会降低系统并发性能; 如果需要完全避免并发冲突的话可以选择这个设置; 如果并发性能很重要可以考虑别的选项设置;
四、如何设置 MySQL 的隔离级别?
可以通过以下两种方式设置 MySQL 的隔离级别:,太魔幻了。
- 全局设置 修改配置文件中的 `transaction_isolation` 参数。
比方说:
transaction_isolation=READ-COMMITTED需要重启 MySQL 服务才能生效。此方式会影响所有连接到数据库的客户端。注意配置文件位置不同会导致不同的生效方式及效果不一样 . 下图展示不同操作系统下对应的配置路径及常见参数说明 :操作系统 配置文件路径 参数 说明 Linux /etc/mysql/my.cnf transaction_isolation 全局设置交易隔离级别 Linux /usr/local/mysql/my.cnf transaction_isolation 全局设置交易隔离级别 Windows C:\ProgramData\MySQL\MySQL Server \my.ini transaction_isolation 全局设置交易隔离级别 macOS /usr/local/mysql/support-files/my-default.cnf transaction_isolation 全局设置交易隔离级别或者 /opt/ /support-files/...
SET GLOBAL transactionisolation = READ COMMITTED; 或者SET SESSION transactionisolation = REPEATABLE READ; 此方法只影响当前会话或连接 , 修改完成后会自动恢复为上次配置值.
此命令在客户端运行后生效 , 但是如果不重启客户端或者连接则无效 . 下图展示不同客户端下操作方式 :
| 客户端 | 操作方式 | 说明 |
|---|---|---|
| MySQL Shell or mysql client CLI tool | 使用SET GLOBAL or SET SESSION命令修改当前会话的全局或会话的变量值 . 具体参考上面例子说明 . |
五、实际应用示例
| 场景 | 适用隔离级别 | 原因 |
|---|---|---|
| 电商网站商品库存管理 | REPEATABLE READ 或 SERIALIZABLE | 确保同一时刻对同一商品信息的操作后来啊一致性; 防止因并发修改导致库存错误等问题. . 高并发场景下尽量选择可重复读取来保证数据的准确性 ; 低并发场景下选择SERIALIZABLE 可以保证绝对的数据一致性 , 但也会牺牲一定的性能 。 如果对数据的一致性要求极高且业务量不大则选择SERIALIZABLE ; 反之则可考虑较低级别的规则 。 下面举例说明 : 一个电商网站统计某个商品的销量 , 该统计后来啊应该是一致的 ; 主要原因是如果多个线程一边计算销量 , 但是每次计算的后来啊都不一样会导致错误的决策 ; 所以可以使用SERIALIZABLE 来确保统计后来啊的一致性 。 但是如果该商品的销量统计不是关键性的信息, 则可以使用REPEATABLE READ 来提高系统吞吐量 。 一些在线游戏中的角色属性更新 , 可以使用READ COMMITTED 或者 REPEATABLE READ 来提高系统的响应速度 。 在一些重要的金融交易中建议使用 SERIALIZABLE 来确保绝对的数据一致性和平安性 。 |
| 银行转账系统 | ||
| 视频点播系统播放进度同步 | REPEATABLE READ 或 SERIALIZABLE 如果实时性要求不高, 可优先考虑降低复杂度以提高响应速度 . 如果需要保证实时同步效果, 则需要选择更高的原子性和一致性级别的规则 . |

