事务特性
事务四大特性及其实现
事务的四大特性(ACID)是数据库事务的核心原则:
-
原子性(Atomicity)
- 定义:事务是一个不可分割的操作单元,要么全部执行成功,要么全部回滚。
- 实现:通过 Undo Log 实现回滚操作,确保事务失败时恢复到初始状态。
-
一致性(Consistency)
- 定义:事务执行前后,数据库的状态必须保持一致,满足所有的完整性约束。
- 实现:通过约束(如主键、外键、唯一性约束)和触发器等机制,确保数据一致性。
-
隔离性(Isolation)
- 定义:多个事务并发执行时,一个事务的中间状态对其他事务不可见。
- 实现:通过锁机制(行锁、表锁)或 MVCC(多版本并发控制) 实现隔离。
-
持久性(Durability)
- 定义:事务一旦提交,其结果将永久保存在数据库中,即使系统崩溃也不会丢失。
- 实现:通过 Redo Log 记录已提交事务的操作,确保系统崩溃后可以恢复数据。
MySQL 隔离级别有哪些
MySQL 提供了四种事务隔离级别,从低到高依次为:
-
读未提交(Read Uncommitted)
- 一个事务可以读取到其他事务未提交的数据。
- 问题:可能出现脏读、不可重复读和幻读。
-
读已提交(Read Committed)
- 一个事务只能读取到其他事务已提交的数据。
- 问题:解决了脏读,但仍可能出现不可重复读和幻读。
-
可重复读(Repeatable Read)(MySQL 默认隔离级别)
- 一个事务在开始时读取到的数据,在整个事务中保持一致。
- 问题:解决了脏读和不可重复读,但可能出现幻读。
- 实现:通过 MVCC(多版本并发控制)解决幻读问题。
-
可串行化(Serializable)
- 强制事务按顺序执行,完全避免了脏读、不可重复读和幻读。
- 问题:性能较低,可能导致大量锁等待。
默认隔离级别是哪个?可能面临什么问题?
-
默认隔离级别:
MySQL InnoDB 存储引擎的默认隔离级别是 可重复读(Repeatable Read)。 -
可能面临的问题:
- 在可重复读隔离级别下,可能出现 幻读 问题。
- 幻读:指一个事务在两次查询之间,其他事务插入了新数据,导致第二次查询结果与第一次不同。
-
解决方法:
MySQL 使用 Next-Key Lock(间隙锁) 机制解决幻读问题。间隙锁会锁住查询范围内的记录及其间隙,防止其他事务插入新数据。
脏读、不可重复读和幻读的区别
| 类型 | 定义 | 解决方式 |
|---|---|---|
| 脏读 | 一个事务读取到另一个事务未提交的数据。 | 使用 读已提交 或更高隔离级别 |
| 不可重复读 | 一个事务在两次读取同一数据时,结果不同(数据被其他事务修改)。 | 使用 可重复读 或更高隔离级别 |
| 幻读 | 一个事务在两次查询时,结果集的行数不同(其他事务插入了新数据)。 | 使用 可串行化 或间隙锁(Next-Key Lock) |
通过理解事务的四大特性、MySQL 的隔离级别及其问题,可以更好地设计和优化数据库事务,确保数据的一致性和可靠性。