Mysql 事务

MySQL 中的 事务(Transaction) 是数据库操作的一个重要概念,它确保了数据在并发访问和系统故障时的一致性和可靠性。


✅ 一、事务的四大特性:ACID

ACID 是事务的基本特征,也是关系型数据库的核心原则。

特性含义简要说明
A - Atomicity(原子性)事务是一个不可分割的工作单位,要么全部成功,要么全部失败。如果事务中某条 SQL 执行失败,整个事务都会回滚。
C - Consistency(一致性)事务必须使数据库从一个一致状态变换到另一个一致状态。事务执行前后,数据库完整性约束(如主键、外键等)不能被破坏。
I - Isolation(隔离性)多个事务并发执行时,彼此之间应该互不干扰。不同的隔离级别决定了事务之间的可见性。
D - Durability(持久性)事务一旦提交,对数据库的修改就是永久性的。即使系统崩溃,已提交的事务也不会丢失。

✅ 二、事务的四种隔离级别(Isolation Levels)

不同隔离级别控制的是事务之间读取未提交数据或并发写入时的行为,主要解决以下三个问题:

  • 脏读(Dirty Read)
  • 不可重复读(Non-repeatable Read)
  • 幻读(Phantom Read)
隔离级别脏读不可重复读幻读加锁读
READ UNCOMMITTED✅ 允许✅ 允许✅ 允许
READ COMMITTED❌ 禁止✅ 允许✅ 允许
REPEATABLE READ❌ 禁止❌ 禁止❌ 禁止(MySQL InnoDB 特殊处理)✅ 支持
SERIALIZABLE❌ 禁止❌ 禁止❌ 禁止✅ 支持

🔧 设置事务隔离级别的方法:

-- 查看当前会话/全局的隔离级别
SELECT @@tx_isolation; -- MySQL 5.7 及之前
SELECT @@transaction_isolation; -- MySQL 8.0+

-- 设置隔离级别(会话级)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 设置隔离级别(全局级)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

✅ 三、事务隔离级别是怎么实现的?

InnoDB 存储引擎通过以下机制来实现不同的事务隔离级别:


🧠 1. MVCC(多版本并发控制)

  • MVCC 主要用于实现 读已提交(Read Committed)可重复读(Repeatable Read) 的隔离级别。
  • 它通过 Undo Log + Read View 来提供非锁定一致性读。
核心组件:
  • Undo Log(撤销日志):保存数据的历史版本。
  • Read View(读视图):决定当前事务能看到哪些版本的数据。
实现效果:
  • 事务看到的是一个“快照”,不会被其他事务的未提交更改影响。
  • REPEATABLE READ 下,同一个事务多次查询结果保持一致。
  • READ COMMITTED 下,每次查询都生成新的 Read View,看到最新的已提交数据。

🧠 2. 锁机制(Locking)

对于更高隔离级别(如 SERIALIZABLE),InnoDB 使用锁来防止并发冲突。

类型描述
共享锁(S Lock)读锁,允许多个事务同时读取同一资源,但阻止写操作。
排他锁(X Lock)写锁,阻止其他事务读写该资源。
间隙锁(Gap Lock)锁定索引记录之间的“间隙”,防止插入新记录(用于防止幻读)。
临键锁(Next-Key Lock)Gap Lock + Record Lock,是 InnoDB 默认使用的锁类型。
示例:
START TRANSACTION;
SELECT * FROM user WHERE id = 1 FOR UPDATE; -- 加 X 锁

🧠 3. InnoDB 如何处理幻读?

虽然标准上 REPEATABLE READ 允许幻读,但 InnoDB 在 RR 级别下通过 Next-Key Lock 避免了幻读

例如:

START TRANSACTION;
SELECT * FROM user WHERE age BETWEEN 20 AND 30; -- 查询范围
-- 此时另一个事务试图插入 age=25 的记录会被阻塞,直到前一个事务提交或回滚

🧠 4. Redo Log / Undo Log 的作用

日志类型作用对应事务特性
Redo Log记录物理页的修改,用于崩溃恢复持久性(Durability)
Undo Log记录逻辑修改,用于事务回滚和 MVCC原子性(Atomicity)、一致性(Consistency)

✅ 四、不同隔离级别的行为对比

隔离级别实现机制是否加锁能否避免
READ UNCOMMITTED直接读取最新数据❌脏读、❌不可重复读、❌幻读
READ COMMITTEDMVCC(每语句新 Read View)✅脏读、❌不可重复读、❌幻读
REPEATABLE READMVCC(事务开始固定 Read View)+ Next-Key Lock❌/✅✅脏读、✅不可重复读、✅幻读
SERIALIZABLE所有 SELECT 自动加 S 锁✅脏读、✅不可重复读、✅幻读

✅ 五、默认隔离级别是什么?

  • MySQL 默认隔离级别为:REPEATABLE READ
  • 可以使用如下命令查看:
    SELECT @@global.transaction_isolation, @@session.transaction_isolation;
    

✅ 六、如何选择合适的隔离级别?

应用场景推荐级别原因
高并发读写系统(如电商下单)REPEATABLE READInnoDB 默认支持,性能与一致性平衡
强一致性要求(如金融转账)SERIALIZABLE绝对一致性,但牺牲并发性能
数据分析类应用READ COMMITTED保证读到已提交数据即可
快速读取无一致性要求READ UNCOMMITTED极端情况才用,容易出错

✅ 七、补充:InnoDB 是如何实现事务的?

InnoDB 使用 事务日志(Redo Log & Undo Log)锁机制 来实现完整的事务支持。

组件功能
Redo Log提供 crash-safe,确保事务持久性
Undo Log支持事务回滚和 MVCC
Lock System控制并发访问,实现隔离性
Transaction Manager管理事务生命周期(开启、提交、回滚)

MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务的隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值