什么是 ACID 特性?

简介: 【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实时生图绘板
目录
相关文章
|
安全 数据库 存储
数据库设计基石:一文搞懂 1NF、2NF、3NF 三大范式
数据库设计常遇数据冗余、增删改异常?根源往往是表结构不规范。本文带你轻松掌握数据库三大范式——1NF、2NF、3NF,从原子列到消除依赖,层层递进,提升数据一致性与可维护性,让数据库设计更高效、安全!#数据库 #范式设计
4864 0
|
人工智能 运维 安全
AI 安全架构概述
AI 安全架构涵盖数据采集、模型训练、推理部署等阶段,确保安全性、隐私与合规。其核心组件包括数据层、模型层、推理层、应用层和运维层,针对数据安全威胁(如数据投毒)、模型窃取、对抗攻击及系统漏洞等风险,提出数据加密、对抗训练、联邦学习等防御策略,并强调开发前、开发中和部署后的最佳实践,以降低 AI 解决方案的安全风险。
1817 14
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
898 2
|
缓存 数据库 开发者
理解Python的魔术方法:让类更“Pythonic”的魔法钥匙
魔术方法(Magic Methods)是Python中以双下划线开头和结尾的特殊方法,如`__init__`、`__str__`等,用于定义类在特定操作下的行为。它们使自定义对象能像内置类型一样自然地支持运算符、迭代、上下文管理等功能,提升代码可读性与一致性。合理使用可实现Pythonic风格编程,是掌握高级面向对象编程的关键。
642 0
|
人工智能 JSON 开发工具
解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
本文介绍了一种基于用户意图的提示词优化系统,利用多智能体架构实现自动化优化,提升少样本学习场景下的提示词质量与模型匹配度。系统通过专用智能体协同工作,识别并修复逻辑矛盾、格式不清及示例不一致等问题,结合Pydantic结构化数据模型与OpenAI评估框架,实现高效、可扩展的提示词优化流程。该方案显著减少了人工干预,增强了系统效率与输出一致性,适用于复杂研究任务与深度AI应用。
1393 0
解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
|
弹性计算 API 云计算
使用LobeChat轻松打造私人智能聊天助手
阿里云计算巢提供了一键部署LobeChat的功能,无需下载代码或安装复杂依赖,通过简单几步即可搭建私人聊天助手,非常适合非技术人员。LobeChat是一款现代化设计的开源聊天应用,支持语音合成及多模态插件系统。部署前需确保已开通阿里云账号且余额充足。
使用LobeChat轻松打造私人智能聊天助手
|
JSON 物联网 数据格式
什么是MQTT 遗嘱消息(Will Message)
【2月更文挑战第17天】
1462 7
什么是MQTT 遗嘱消息(Will Message)
|
敏捷开发 传感器 机器学习/深度学习
阿里妈妈智造字,全新可变字体再发布
万变的时代,研发可变的字体。阿里妈妈智造字继发布数黑体、数智体、东方大楷后再次发布3款字:书法体——阿里妈妈刀隶体,可变体——阿里妈妈方圆体、阿里妈妈灵动体(alimama agile)。01从多到一,以AI孵化可变字体-可变字体作为屏显时代科技与设计艺术结合的产物,阿里妈妈妈智造字研究并拓展其设计形态的表达与应用,挖掘屏显时代字体设计的巨大潜力,满足受众不断变化的阅读需求。可变技术带来的字体设计
25160 1
阿里妈妈智造字,全新可变字体再发布
|
存储 Java Serverless
哈希表以及哈希冲突
哈希表以及哈希冲突
410 0
哈希表以及哈希冲突
|
设计模式 安全 Java