Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL事务机制和隔离级别

MySQL事务机制和隔离级别使用方式

作者:我需要打球

MySQL事务通过ACID特性保障数据一致性,隔离级别(读未提交、读已提交、可重复读、串行化)平衡并发性能与数据安全,InnoDB默认使用可重复读,依赖MVCC避免脏读和不可重复读,间隙锁减少幻读,需根据场景权衡一致性与性能

MySQL 的事务机制是保证数据库操作一致性和可靠性的核心特性,而隔离级别则用于平衡事务并发时的性能数据一致性

以下是详细解析:

一、事务的四大特性(ACID)

事务(Transaction)是一组不可分割的 SQL 操作,要么全部成功,要么全部失败,核心依赖四大特性:

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

持久性(Durability)

二、事务的隔离级别(SQL 标准定义)

MySQL 的隔离级别从低到高分为 4 种,级别越高,并发控制越严格,但性能开销越大

隔离级别脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read)说明
读未提交(Read Uncommitted)可能发生可能发生可能发生一个事务可读取另一个未提交的修改,极少使用(如实时数据监控场景)。
读已提交(Read Committed)不会发生可能发生可能发生一个事务只能读取另一个已提交的修改(Oracle 默认级别)。
可重复读(Repeatable Read)不会发生不会发生几乎不发生事务中多次读取同一数据结果一致(MySQL InnoDB 默认级别)。
串行化(Serializable)不会发生不会发生不会发生事务串行执行,完全避免并发问题,但性能极低(仅用于严格数据一致性场景)。

三、各隔离级别的典型场景与实现

1. 读未提交(Read Uncommitted)

2. 读已提交(Read Committed)

3. 可重复读(Repeatable Read,MySQL 默认)

4. 串行化(Serializable)

四、MySQL 中设置与查看隔离级别

1. 查看当前隔离级别

-- MySQL 8.0+
SELECT @@transaction_isolation;

-- MySQL 5.7及以下
SELECT @@tx_isolation;

2. 设置隔离级别(当前会话或全局)

-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别名称;

-- 设置全局隔离级别(需重新连接生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别名称;

-- 示例:设置当前会话为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

五、事务控制语句

START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;  -- 设置保存点
UPDATE account SET balance = balance + 100 WHERE id = 2;
ROLLBACK TO sp1;  -- 回滚到保存点(仅撤销第二条更新)
COMMIT;

六、面试核心考点

  1. 默认隔离级别:MySQL InnoDB 默认是可重复读(Repeatable Read),这是与其他数据库(如 Oracle 默认读已提交)的重要区别。
  2. MVCC 与隔离级别的关系:MVCC 是实现可重复读和读已提交的核心机制,通过数据多版本快照避免加锁阻塞。
  3. 隔离级别与性能权衡:级别越高,一致性越好,但并发性能越差,实际应用中通常选择读已提交可重复读
  4. 幻读的处理:InnoDB 在可重复读级别通过间隙锁减少幻读,而串行化级别完全避免幻读。

理解事务机制和隔离级别,是设计高并发、高可靠数据库应用的基础,尤其在金融、电商等对数据一致性要求严格的场景中至关重要。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文