---
title: 数据库ACID四大特性
published: 2025-08-07
description: ''
image: ''
tags: [ACID,四大特性]
category: '中间件 > MySQL'
draft: false 
lang: ''
---


# 什么是ACID四大特性
A ： Atomicity（原子性）
C ： Consistency（一致性）
I ： Isolation（隔离性）
D ： Durability（持久性）

![](https://blog.meowrain.cn/api/i/2025/08/09/qrczot-1.webp)

# Atomicity（原子性）
这里要先讲一下什么是事务：  简单说，事务就是一组原子性的SQL执行单元。如果数据库引擎能够成功地对数据库应 用该组査询的全部语句，那么就执行该组SQL。如果其中有任何一条语句因为崩溃或其 他原因无法执行，那么所有的语句都不会执行。要么全部执行成功（commit），要么全部执行失败（rollback）。

**原子性指的是一个事务中所有操作要么全部成功要么全部失败。**

# Consistency（一致性）
数据库的一致性指的是： 每个事务必须使数据库从一个合法的状态，转变到另一个合法的状态，并且在事务执行前后，数据库的各种完整性约束都得以保持。

什么是完整性约束呢？
完整性约束是指数据库中数据的规则和限制，比如主键约束、外键约束、唯一性约束等。
主键约束： 确保每条记录都有唯一标识。
外键约束： 确保数据之间的引用关系正确。
唯一性约束： 确保某列的值在表中是唯一的

![](https://blog.meowrain.cn/api/i/2025/08/08/f8ed5e-1.webp)

举个例子：
当我们向订单表插入一条记录的时候，如果指定的`customer_id`在客户表中不存在，那么这个事务就不应该被提交，因为这会破坏数据的一致性。因此，外键约束会阻止事务提交，确保数据库的一致性。抛出外键约束异常


# Isolation（隔离性）
数据库的隔离性指的是： 每个事务的执行都应该是独立的，互不干扰。即使多个事务同时执行，也不会影响彼此的结果。
隔离性确保了事务之间的独立性，防止了脏读、不可重复读和幻读等问题。

如果没有隔离性，在多个用户并发访问数据库的情况下，可能会出现以下问题：
- 脏读(Dirty Read):
    一个事务读取到另一个事务尚未提交的修改，如果该事务回滚，那么读取到的就是无效数据。
- 不可重复读(Non-repeatable Read):
    一个事务在同一事务内多次读取同一数据，却得到不同的结果，这是因为其他事务修改并提交了数据。
- 幻读(Phantom Read):
    一个事务在同一事务内多次执行相同的查询，但是每次查询返回的结果集不同，这是因为其他事务插入或删除了数据。

![](https://blog.meowrain.cn/api/i/2025/08/08/f82hdp-1.webp)

事务隔离级别：
- 读未提交 >> 事务可以读取其他事务未提交的数据，可能会导致脏读。
- 读已提交 >> 事务只能读取已提交的数据，防止脏读。
- 可重复读 >> 事务在执行期间多次读取同一数据，结果保持一致，防止不可重复读。
- 串行化 >> 事务完全隔离，按顺序执行，防止幻读。


数据库的默认隔离级别是**可重复读（Repeatable Read）**，它可以防止脏读和不可重复读，但可能会出现幻读。（也就是无法避免读取数据的时候，其他事务提交新的数据或者删除数据，导致查询的结果集发生变化。

> 之前老把幻读和不可重复读搞混，现在再讲一下，所谓幻读，就是说读取数据过程中，另外一个数据库事务插入或者删除了数据，导致查询的数据结果集发生变化。而不可重复读是指在同一个事务中多次读取同一个数据，期间其他事务修改了数据，导致数据结果集不一致。

每个隔离级别都提供了不同程度的隔离性和性能，具体选择取决于应用场景和需求。
# Durability（持久性）
数据库的持久性指的是： 一旦事务提交，对数据库的修改就会永久保存，即使系统崩溃也不会丢失。
持久性确保了数据的可靠性和稳定性，即使在系统故障或崩溃后，已提交的事务数据仍然可以恢复。