什么是 ACID 特性?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【8月更文挑战第3天】

ACID 是数据库事务处理系统的四个关键属性的缩写,这四个属性确保了数据库操作的可靠性和一致性。ACID 代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些属性定义了数据库事务在处理数据时必须满足的条件,以确保数据的完整性和系统的可靠性。

1. 原子性(Atomicity)

原子性是指数据库事务中的所有操作要么全部完成,要么全部不完成。换句话说,一个事务是一个不可分割的单元,事务中的每一个操作都必须成功完成,否则所有操作都将被回滚到事务开始前的状态。这确保了在发生系统故障或其他问题时,数据库不会处于不一致的状态。

1.1 原子性的实现

原子性通常通过事务日志(Transaction Log)和恢复机制来实现。当一个事务开始时,数据库系统会在日志中记录事务的状态和操作。当事务成功完成时,系统会在日志中记录事务已提交(committed)的状态。如果在事务执行过程中发生了故障,系统可以使用日志将数据库恢复到事务开始前的状态,从而确保原子性。

以下是一个示例,展示了原子性在银行转账操作中的应用:

START TRANSACTION;

-- 从账户 A 中扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

-- 向账户 B 中增加 100 元
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

COMMIT;

如果在扣除账户 A 的余额后但在增加账户 B 的余额前发生故障,事务将回滚,账户 A 的余额将恢复到原始状态,从而确保原子性。

2. 一致性(Consistency)

一致性是指事务在完成后,数据库必须从一个一致的状态转换到另一个一致的状态。事务执行前和执行后的数据库状态必须满足所有的约束条件和规则。数据库的一致性确保了数据的完整性和正确性。

2.1 一致性的实现

一致性通常通过数据库约束(如主键约束、外键约束、唯一约束和检查约束)以及触发器(Triggers)和存储过程(Stored Procedures)来实现。这些约束和规则在事务执行时被强制执行,以确保数据的一致性。

以下是一个示例,展示了一致性在订单处理中的应用:

START TRANSACTION;

-- 检查库存是否充足
IF (SELECT stock FROM products WHERE product_id = 'P1') >= 10 THEN

    -- 减少库存
    UPDATE products SET stock = stock - 10 WHERE product_id = 'P1';

    -- 创建订单
    INSERT INTO orders (order_id, product_id, quantity) VALUES ('O1', 'P1', 10);

ELSE
    -- 库存不足,回滚事务
    ROLLBACK;
END IF;

COMMIT;

在这个示例中,事务在减少库存和创建订单前检查库存是否充足。如果库存不足,事务将回滚,确保数据库的一致性。

3. 隔离性(Isolation)

隔离性是指多个并发事务相互独立执行,一个事务的执行不应影响其他事务的执行。隔离性通过控制事务之间的相互影响,防止并发操作导致的数据不一致问题。不同的隔离级别定义了事务间相互隔离的程度。

3.1 隔离级别

SQL 标准定义了四种隔离级别,每种隔离级别提供不同程度的隔离性:

  • 未提交读(Read Uncommitted):允许一个事务读取另一个事务尚未提交的数据,可能导致脏读(Dirty Read)。
  • 提交读(Read Committed):只允许一个事务读取另一个事务已提交的数据,防止脏读,但可能导致不可重复读(Non-repeatable Read)。
  • 可重复读(Repeatable Read):确保一个事务在执行过程中多次读取同一数据时,其结果是一致的,防止脏读和不可重复读,但可能导致幻读(Phantom Read)。
  • 串行化(Serializable):完全隔离的事务执行方式,确保事务顺序执行,防止脏读、不可重复读和幻读,但代价是性能开销较大。

以下是一个示例,展示了隔离性在银行账户查询中的应用:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

-- 第一次查询账户余额
SELECT balance FROM accounts WHERE account_id = 'A';

-- 在同一事务中进行一些操作(可能包含更新操作)

-- 第二次查询账户余额
SELECT balance FROM accounts WHERE account_id = 'A';

COMMIT;

在这个示例中,设置了可重复读隔离级别,确保两次查询同一账户的余额结果一致,防止不可重复读。

4. 持久性(Durability)

持久性是指事务一旦提交,其结果将永久保存到数据库中,即使发生系统故障也不会丢失。这确保了提交的事务在持久存储中被正确记录,并在系统恢复后仍然存在。

4.1 持久性的实现

持久性通常通过事务日志和数据库备份来实现。当一个事务提交时,数据库系统会将事务的所有修改写入事务日志,并在适当的时候将日志中的数据刷新到持久存储中。如果系统发生故障,系统可以通过重放事务日志来恢复数据库的持久状态。

以下是一个示例,展示了持久性在订单提交中的应用:

START TRANSACTION;

-- 创建订单
INSERT INTO orders (order_id, customer_id, order_date) VALUES ('O1', 'C1', NOW());

-- 添加订单详情
INSERT INTO order_details (order_id, product_id, quantity, price) VALUES ('O1', 'P1', 2, 19.99);

COMMIT;

在这个示例中,一旦事务提交,订单和订单详情将被持久保存到数据库中,即使系统在提交后发生故障,订单信息也不会丢失。

5. ACID 特性的实际应用

ACID 特性在实际应用中非常重要,特别是在银行系统、电子商务平台和企业资源规划(ERP)系统等对数据一致性和可靠性要求极高的场景中。以下是一些具体的应用示例:

5.1 银行系统

在银行系统中,ACID 特性确保了账户转账操作的可靠性和一致性。每次转账操作必须确保资金从一个账户扣除并正确添加到另一个账户,同时在系统发生故障时能够正确恢复数据。

5.2 电子商务平台

在电子商务平台中,ACID 特性确保了订单处理的可靠性和一致性。每个订单的创建、更新和支付必须保证数据的完整性,防止库存错误、订单丢失或支付失败。

5.3 企业资源规划(ERP)系统

在 ERP 系统中,ACID 特性确保了业务流程的可靠性和一致性。每个业务操作(如采购、生产和销售)的数据必须正确记录,确保系统在发生故障时能够正确恢复。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
存储 Java
Java堆和栈的区别和介绍以及JVM的堆和栈
Java堆和栈的区别和介绍以及JVM的堆和栈 一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。
6362 0
|
6月前
|
存储 SQL 数据库
【赵渝强老师】OceanBase的部署架构
OceanBase数据库支持两种部署架构:无共享(Shared-Nothing,SN)模式和共享存储(Shared-Storage,SS)模式。SN模式下,各节点对等,具备高扩展性、可用性和性能,运行于普通PC服务器集群;SS模式采用存算分离架构,租户数据存储在共享对象存储上,本地缓存热点数据。两种模式均支持高可用与多副本一致性,适用于不同业务场景。
423 1
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
550 13
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
10940 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
存储 数据库 数据库管理
什么是ACID事务
【10月更文挑战第17天】什么是ACID事务
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
Java Spring
Spring中那些BeanPostProcessor在Bean实例化过程中的作用
Spring中那些BeanPostProcessor在Bean实例化过程中的作用
501 1
|
存储 SQL 自然语言处理
|
机器学习/深度学习 自然语言处理 并行计算
扩散模型
本文详细介绍了扩散模型(Diffusion Models, DM),一种在计算机视觉和自然语言处理等领域取得显著进展的生成模型。文章分为四部分:基本原理、处理过程、应用和代码实战。首先,阐述了扩散模型的两个核心过程:前向扩散(加噪)和逆向扩散(去噪)。接着,介绍了训练和生成的具体步骤。最后,展示了模型在图像生成、视频生成和自然语言处理等领域的广泛应用,并提供了一个基于Python和PyTorch的代码示例,帮助读者快速入门。
|
Kubernetes 关系型数据库 MySQL
k8s安装并迁移jumpserver
k8s安装并迁移jumpserver
下一篇
oss云网关配置