当前位置: 首页 > article >正文

数据库事务的四大特性(ACID)

一、前言

在现代数据库系统中,事务(Transaction)是确保数据一致性和完整性的重要机制。事务的四大特性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称 ACID,是数据库事务处理的核心原则。

二、事务的四大特性详解

1. 原子性(Atomicity)

定义

原子性是指事务中的所有操作要么全部成功执行,要么全部失败回滚,不存在中间状态。事务是一个不可分割的最小工作单元。

作用
  • 防止部分操作成功而部分操作失败导致的数据不一致。
  • 例如,在银行转账场景中,扣款和加款必须同时成功或同时失败,否则会导致资金丢失或重复。
实现机制
  • 回滚日志(Undo Log):在事务执行前,数据库会记录操作的备份数据。如果事务失败,通过Undo Log将数据恢复到事务开始前的状态。
  • 原子操作:数据库引擎通过底层的原子操作(如行锁)确保事务的不可分割性。
实例分析

假设用户A向用户B转账100元:

  1. 从A账户扣除100元。
  2. 向B账户增加100元。
    如果步骤1成功但步骤2失败,事务会回滚,A和B的账户余额都会恢复到原始状态,避免资金异常。
技术实现
  • InnoDB存储引擎:通过Undo Log记录事务修改前的旧版本数据,支持回滚操作。
  • 日志系统:事务执行前,数据库将操作写入日志(如Redo Log),确保即使系统崩溃也能恢复。

2. 一致性(Consistency)

定义

一致性要求事务执行前后,数据库的完整性约束(如主键、外键、唯一性约束等)始终有效,数据必须从一个一致性状态转换到另一个一致性状态。

作用
  • 确保事务符合业务规则和逻辑。
  • 例如,银行账户的余额不能为负数,转账后总金额必须保持不变。
实现机制
  • 数据库约束:通过主键、外键、唯一索引等约束条件强制数据完整性。
  • 应用逻辑校验:在事务中编写业务规则校验(如库存不足时拒绝交易)。
  • 原子性+隔离性:事务的原子性和隔离性共同保障一致性。
实例分析

在电商系统中,用户下单时需扣除商品库存:

  1. 检查库存是否充足。
  2. 扣除库存并生成订单。
    如果库存不足,事务直接回滚,确保不会出现超卖现象。
技术实现
  • 约束校验:数据库在事务提交前进行约束检查(如外键约束、唯一性约束)。
  • 触发器(Triggers):通过触发器自动执行业务规则校验。

3. 隔离性(Isolation)

定义

隔离性要求多个并发事务之间相互隔离,彼此的操作互不干扰,避免并发执行导致的数据不一致问题(如脏读、不可重复读、幻读)。

作用
  • 解决并发事务的干扰问题。
  • 通过不同的隔离级别(如读已提交、可重复读、串行化)控制事务的可见性和并发程度。
实现机制
  • 锁机制:通过行锁、表锁等限制并发事务对数据的访问。
  • 多版本并发控制(MVCC):通过保存数据的多个版本,允许事务读取一致性快照,避免直接锁表。
  • 隔离级别
    • 读未提交(Read Uncommitted):最低级别,允许脏读。
    • 读已提交(Read Committed):避免脏读,但可能出现不可重复读。
    • 可重复读(Repeatable Read):避免脏读和不可重复读,但可能出现幻读(MySQL默认级别)。
    • 串行化(Serializable):最高级别,完全隔离,但并发性能最差。
实例分析

假设有两个并发事务同时修改同一商品的库存:

  1. 事务1:查询库存为100,准备下单。
  2. 事务2:查询库存为100,准备下单。
    如果隔离级别过低,可能导致两个事务都扣减库存,最终库存变为0,而实际应剩余50。通过锁机制或MVCC可以避免此类问题。
技术实现
  • InnoDB存储引擎:通过锁(行锁、间隙锁)和MVCC实现不同隔离级别的并发控制。
  • Read View:事务开启时生成一个Read View,记录当前活跃事务ID列表,通过版本链判断数据可见性。

4. 持久性(Durability)

定义

持久性要求事务一旦提交,对数据库的修改是永久性的,即使系统崩溃或断电,数据也不会丢失。

作用
  • 确保事务的提交结果持久化存储。
  • 例如,转账完成后,即使数据库宕机,账户余额的变化仍会被保留。
实现机制
  • 重做日志(Redo Log):事务提交时,数据库会将操作记录写入Redo Log,并持久化到磁盘。即使系统崩溃,恢复时可以通过Redo Log重放事务操作。
  • 磁盘持久化:数据最终会从内存刷新到磁盘,确保物理存储的可靠性。
实例分析

用户提交订单后,数据库会将订单信息写入Redo Log并刷新到磁盘。即使服务器突然断电,重启后仍能通过Redo Log恢复订单数据,避免数据丢失。

技术实现
  • 日志刷盘策略:通过innodb_flush_log_at_trx_commit参数控制Redo Log的刷盘频率。
  • 双写缓冲(Double Write Buffer):防止部分写失败导致数据损坏。

三、四大特性之间的关系

特性作用与其他特性的关系
原子性保证操作的完整性和回滚能力是一致性和持久性的基础
一致性事务的最终目标依赖原子性、隔离性和持久性共同实现
隔离性控制并发事务的干扰通过锁和MVCC保障一致性
持久性确保数据永久存储通过Redo Log和磁盘持久化实现

四、实际应用中的权衡

1. 性能与一致性

  • 高隔离级别(如串行化)能完全避免并发问题,但会降低并发性能。
  • 低隔离级别(如读未提交)性能高,但可能导致脏读、不可重复读等问题。

2. 分布式事务

  • 在微服务架构中,单数据库的ACID特性无法直接满足跨服务的事务需求,需通过分布式事务方案(如两阶段提交、TCC模式)实现最终一致性。

五、ACID特性在数据库中的实现

1. MySQL(InnoDB引擎)

  • 原子性:通过Undo Log记录旧版本数据,支持回滚。
  • 一致性:通过外键约束、唯一索引等保障数据完整性。
  • 隔离性:通过MVCC和锁机制(如行锁、间隙锁)实现不同隔离级别。
  • 持久性:通过Redo Log和双写缓冲确保数据持久化。

2. PostgreSQL

  • 原子性:通过Write-Ahead Logging(WAL)记录事务日志。
  • 一致性:通过约束检查和触发器保障。
  • 隔离性:基于MVCC实现,支持四种隔离级别。
  • 持久性:通过WAL日志和数据页刷盘实现。

六、ACID特性的挑战与优化

1. 并发控制的挑战

  • 锁冲突:高并发场景下,锁竞争可能导致性能下降。
  • 死锁:事务之间相互等待资源,需通过死锁检测和超时机制解决。

2. 性能优化策略

  • 选择合适的隔离级别:根据业务需求权衡一致性与性能。
  • 减少事务粒度:尽量缩短事务执行时间,减少锁持有时间。
  • 批量操作:通过批量插入/更新减少事务提交次数。

3. 分布式事务的解决方案

  • 两阶段提交(2PC):协调多个参与者提交或回滚。
  • TCC模式:通过Try-Confirm-Cancel三阶段实现最终一致性。
  • Saga模式:通过分解事务为多个本地事务,支持补偿机制。

相关文章:

数据库事务的四大特性(ACID)

一、前言 在现代数据库系统中,事务(Transaction)是确保数据一致性和完整性的重要机制。事务的四大特性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)…...

网络安全全知识图谱:威胁、防护、管理与发展趋势详解

1 网络安全基础概念 1.1 什么是网络安全 网络安全是指通过技术、管理和法律等手段,保护计算机网络系统中的硬件、软件及其系统中的数据,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,确保系统连续可靠正常地运行,网络服务不…...

FreeRTOS 在物联网传感器节点的应用:低功耗实时数据采集与传输方案

FreeRTOS 在物联网传感器节点的应用:低功耗实时数据采集与传输方案 二、FreeRTOS 任务划分与优先级设计 任务名称优先级执行周期功能描述Sensor_Collect3100ms多传感器数据采集与预处理Data_Process2事件驱动数据滤波/压缩/异常检测LoRa_Transmit41s低功耗长距离数…...

解决 iTerm2 中 nvm 不生效的问题(Mac 环境)

解决 iTerm2 中 nvm 不生效的问题(Mac 环境) 标题 《为什么 iTerm2 无法使用 nvm?—— 解决 Mac 终端环境变量冲突指南》 问题描述 许多开发者在 Mac 上使用 nvm 管理 Node.js 版本时,发现: 原生终端:n…...

Linux环境下基于Docker安装 PostgreSQL数据库并配置 pgvector

文章目录 1 docker-compose 安装 PostgreSQL 容器内安装 pgvector1.1 基于 docker-compose 安装 PostgreSQL 数据库1.2 容器内配置 pgvector 2. docker-compose Dockerfile 形式直接配置PostgreSQL数据库及 pgvector参考资料 PostgreSQL是一种功能强大的开源关系数据库管理系…...

(9)-java+ selenium->元素定位之By name

1.简介 上一篇已经介绍了通过id来定位元素,继续介绍其他剩下的七种定位方法中的通过name来定位元素。本文来介绍Webdriver中元素定位方法之By name,顾名思义,就是我们想要定位的目标元素节点上,有一个name ="value"的属性,这样我们就可以通过name的value直接去…...

深浅拷贝?

一、定义: 浅拷贝:只复制对象的第一层属性,若第一层属性是引用类型(如对象、数组),则复制其内存地址,修改拷贝后的嵌套对象会影响原对象。 深拷贝:递归复制对象的所有层级&#xf…...

Beckhoff PLC 功能块 FB_CTRL_ACTUAL_VALUE_FILTER (模拟量滤波)

1. 功能块概览 名称:FB_CTRL_ACTUAL_VALUE_FILTER(实际值滤波控制功能块)。作用:对测量输入值进行合理性检查( plausibility check )和滤波处理,防止异常跳变(如传感器信号突变&…...

Mysql在SQL层面的优化

以下是MySQL在SQL层面的优化方法及详细案例,结合实际场景说明如何通过调整SQL语句提升性能: 1. 确保索引有效使用 案例:订单状态查询优化 问题SQL: SELECT * FROM orders WHERE status shipped AND create_time > 2023-01-…...

JVM规范之栈帧

JVM规范之栈帧 前言正文概述局部变量表操作数栈动态链接 总结参考链接 前言 上一篇文章了解了JVM规范中的运行时数据区: JVM规范之运行时数据区域 其中,栈是JVM线程私有的内存区,栈中存储的单位是帧(frames)&#xff…...

【C++指南】string(四):编码

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 引言 在 C 编程中,处理字符串是一项极为常见的任务。而理解字符串在底层是如何编码存储的&…...

深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略

LSTM深度解析 一、引言 在深度学习领域,循环神经网络(RNN)在处理序列数据方面具有独特的优势,例如语音识别、自然语言处理等任务。然而,传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题,这使得网…...

AI量化交易是什么?它是如何重塑金融世界的?

第一章:证券交易的进化之路 1.1 从喊价到代码:交易方式的革命性转变 在电子交易普及之前,证券交易依赖于交易所内的公开喊价系统。交易员通过手势、喊话甚至身体语言传递买卖信息,这种模式虽然直观,但效率低下且容易…...

分布式事务处理方案

1. 使用Seata框架解决 1.1 XA 事务 1.1.1 XA整体流程 第一阶段 RM1开启XA事务-> 执行业务SQL -> 上报TC执行结果RM2开启XA事务-> 执行业务SQL -> 上报TC执行结果 第二阶段 TC根据 RM上报结果通知RM一起提交/回滚XA事务 1.1.2 XA特点 XA 模式必须要有数据库的支…...

CVE-2024-36467 Zabbix权限提升

漏洞描述 在Zabbix中,具有API访问权限的已认证用户(例如具有默认用户角色的用户)可以通过调用user.update API接口,将自己添加到任何用户组(如Zabbix管理员组)。然而,用户无法添加到已被禁用或…...

Dify中的自定义模型插件开发例子:以xinference为例

本文使用Dify v1.0.0-beta.1版本。模型插件结构基本是模型供应商(模型公司,比如siliconflow、xinference)- 模型分类(模型类型,比如llm、rerank、speech2text、text_embedding、tts)- 具体模型(…...

crud方法命名示例

以下是基于表名dste_project_indicator(项目指标表)的完整命名示例,覆盖各类增删改查场景: 1. 表名与实体类映射 // 表名:dste_project_indicator // 实体类:DsteProjectIndicatorEntity public class Ds…...

尚硅谷redis7 33-36 redis持久化之RDB优缺点及数据丢失案例

官网说明优点: RDB是Redis数据的一个非常紧凑的单文件时间点表示,RDB文件非常适合备份。例如,您可能希望在最近的24小时内每小时旧档一次RDB文件,并在30天内每天保存一个RDB快照,这使您可以在发生来难时轻松恢复不同版本的数据集。RDB非常适合灾难恢复,它是一个可以…...

No such file or directory: ‘ffprobe‘

目录 详细信息: 解决方法: No such file or directory: ffprobe 详细信息: File "/usr/local/lib/python3.10/dist-packages/framepump/framepump.py", line 168, in get_duration return float(ffmpeg.probe(video_path)[form…...

计算机网络-WebSocket/DNS/Cookie/Session/Token/Jwt/Nginx

文章目录 WebSocketDNS什么是dns域名解析底层协议 cookie/sessionToken/JWTNginx WebSocket 一种网络通信协议,允许在单个 TCP(半双工) 连接上进行全双工通信(客户端和服务器可同时双向传输数据)。 HTTP是基于请求-响…...

功能“递归模式”在 C# 7.3 中不可用,请使用 8.0 或更高的语言版本的一种兼容处理方案

原程序: internal class ControllerParameterCreator : IParameterCreator {private Controller controller;public ControllerParameterCreator(Controller controller){this.controller controller;}public Parameter CreateSystem(string name, int unused){re…...

第4章-操作系统知识

存储管理 固定分区:一种静态分区方式请求分页存储管理覆盖技术:覆盖技术是指让作业中不同时运行的程序模块共同使用同一主存区域。...

将网页带格式转化为PDF

# 一、安装插件 SingleFile | 将完整的页面保存到一个 HTML 文件中 – 下载 🦊 Firefox 扩展(zh-CN) 打开火狐浏览器,安装上面的插件 # 二、下载html单文件 打开对应的网页,点击插件下载对应的html文件 # 三、打开…...

【ArcGIS】ArcGIS AI 助手----复现

github地址 korporalK/Archer-GIS-AI-Assitant:Archer 在 ArcGIS Pro 中将自然语言命令转换为自动化 GIS 工作流。它使用代理框架(计划-验证-执行)构建并由 LLM 提供支持,可简化空间分析、减少手动工作并使 GIS 更易于访问。Arch…...

使用 FFmpeg 将视频转换为高质量 GIF(保留原始尺寸和帧率)

在制作教程动图、产品展示、前端 UI 演示等场景中,我们经常需要将视频转换为体积合适且清晰的 GIF 动图。本文将详细介绍如何使用 FFmpeg 工具将视频转为高质量 GIF,包括: ✅ 保留原视频尺寸或自定义缩放✅ 保留原始帧率或自定义帧率✅ 使用调色板优化色彩质量✅ 降低体积同…...

《Java vs Go vs C++ vs C:四门编程语言的深度对比》

引言​​ 从底层硬件操作到云端分布式系统,Java、Go、C 和 C 四门语言各自占据不同生态位。本文从​​设计哲学​​、​​语法范式​​、​​性能特性​​、​​应用场景​​等维度进行对比,为开发者提供技术选型参考。 一、​​设计哲学与历史定位​​…...

充电枪IEC62196/EN 62196测试内容

充电枪IEC62196/EN 62196测试内容 一、机械性能测试 插拔力测试 交流充电接口的插入/拔出力需≤100N,直流接口≤140N。若使用助力装置,操作力仍需满足上述要求。 测试方法:通过弹簧秤或专用试验机(如Sun-CB设备)测…...

有效的字母异位符--LeetCode

题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 思路一:排序 t 是 s …...

SAP ERP 系统拆分的七大挑战

在企业变革或管理运营风险时,剥离IT系统能带来显著效益,但SAP ERP系统的复杂性使得这项工作充满挑战。如果管理不当,可能会导致数据不一致、运营中断、合规风险和意外成本。由于SAP ERP系统深度集成于企业核心业务流程中,其拆分工…...

AcrelEMS 3.0智慧能源管理平台:构建企业微电网数智化中枢

安科瑞电气顾强 在"双碳"目标驱动下,企业能源管理正从粗放式运营向精细化、智能化转型。AcrelEMS 3.0智慧能源管理平台以微电网为核心载体,通过"感知-分析-决策-控制"的全链路数字化能力,助力工商企业、医疗机构、教育机…...