MySql事务隔离级别是啥?

本文介绍了Mysql中InnoDB引擎的四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE,分别阐述了它们的特点及可能产生的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天去面试了一家公司,php的题目和linux的笔试题都答的还可以!但是数据库这里的笔试题感觉答的一塌糊涂啊!
其中有一题是问到了Mysql 的事务隔离级别。当时一看我就蒙圈了,啥是事务隔离级别?这对于一个PHPer来说,不知道这个东西应该是糗大了。这不回来赶紧学习一下!

MySql事务隔离级别是啥?
简述:翻译自官网(https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
事务隔离是数据库事务处理的一个基础。隔离(Isolation)是ACID中的I。当有多个改变事务在进行,同时又有多个查询(queries)事务时,就应该有一个设置来调节结果的可靠性、一致性和重复性,而这个设置就是隔离级别。
MySql 事务隔离级别(InnoDB引擎)分为4类:

  1. READ UNCOMMITED – 读取未提交内容,会产生脏读
  2. READ COMMITED – 读取已提交内容,导致不可重复读,同一个sql,读取到的数据不一致
  3. REPEATABLE READ – 可重复读(InnoDB 默认的),可能会产生幻读
  4. SERIALIZABLE – 可串行化,比RR严格,可能会产生deadlock和并发性问题

    具体的其他介绍及操作对比,可以参考这个博客,我感觉这个写的又清晰又能让你看得懂!
    博客地址:http://www.cnblogs.com/snsdzjlz320/p/5761387.html
    还有MySql官网,如果你英文比较好,推荐看官网的内容,我能将就着看懂,哈哈!
    mysql 事务隔离级别官网介绍地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

通过今天的面试,我充分意识到了自己数据库知识的不足啊,今后要努力学习了,多看看数据库的书籍,来补充一下这方面的知识才行。

MySQL事务隔离级别用于控制事务之间的可见性和并发行为,以解决并发操作中可能出现的问题(如脏读、不可重复读、幻读等)。MySQL 支持四种标准的事务隔离级别。 --- ## ✅ MySQL事务隔离级别 | 隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 | 丢失更新 | 加锁读 | |----------|------|------|------------|------|----------|--------| | `READ UNCOMMITTED` | 最低的隔离级别,允许读取尚未提交的数据变更 | ✅ 允许 | ✅ 允许 | ✅ 允许 | ✅ 允许 | ❌ 不加锁 | | `READ COMMITTED` | 一个事务只能读取已经提交的数据 | ❌ 禁止 | ✅ 允许 | ✅ 允许 | ❌ 禁止 | ❌ 不加锁(Oracle默认) | | `REPEATABLE READ` | 可重复读,确保同一事务中多次读取的结果一致 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止(InnoDB通过间隙锁解决) | ❌ 禁止 | ✅ 加锁(InnoDB) | | `SERIALIZABLE` | 所有操作串行化执行,避免并发问题 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | ✅ 强制加锁 | > ⚠️ **MySQL InnoDB 引擎在 REPEATABLE READ 隔离级别下已经解决了幻读问题**,这是通过间隙锁(Gap Lock)和临键锁(Next-Key Lock)实现的。 --- ## 🔒 隔离级别与锁机制的关系 - **脏读(Dirty Read)**:一个事务读取了另一个未提交事务的数据。 - **不可重复读(Non-repeatable Read)**:一个事务内多次读取同一数据,结果不一致,因为其他事务修改并提交了该数据。 - **幻读(Phantom Read)**:一个事务内多次查询某个范围的数据,结果集数量变化,因为其他事务插入或删除了匹配的数据。 - **丢失更新(Lost Update)**:两个事务同时更新同一数据,其中一个事务的更新被覆盖。 --- ## 🛠 查看和设置隔离级别 ### 查看当前会话的隔离级别: ```sql SELECT @@tx_isolation; -- 或者 SELECT @@SESSION.tx_isolation; ``` ### 查看全局的隔离级别: ```sql SELECT @@GLOBAL.tx_isolation; ``` ### 设置隔离级别(会话级): ```sql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` ### 设置隔离级别(全局级): ```sql SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` --- ## 💡 实际应用建议 - **默认使用 `REPEATABLE READ`(InnoDB 默认)**:适合大多数业务场景,平衡性能与一致性。 - **需要高并发写入时,选择 `READ COMMITTED`**:适用于 Oracle 用户习惯。 - **对一致性要求极高时,使用 `SERIALIZABLE`**:牺牲性能换取绝对一致性。 - **开发调试阶段可以使用 `READ UNCOMMITTED`**:快速查看未提交数据,但风险很高。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值