事务ACID特性详解

一、ACID基本概念

1.原子性(Atomicity)

  • 定义:事务的所有操作要么全部完成,要么全部不完成,不会停留在中间状态

  • 比喻:就像银行转账,A账户扣款和B账户入账必须同时成功或同时失败

  • 实现机制:通过undo log实现回滚操作

2.一致性(Consistency)

  • 定义:事务执行前后,数据库必须保持一致性状态(遵循业务规则和约束)

  • 包括

    • 实体完整性(主键约束)

    • 参照完整性(外键约束)

    • 用户定义完整性(业务规则)

  • 实现:由应用层和数据库共同保证

3.隔离性(Isolation)

  • 定义:并发事务之间相互隔离,一个事务的操作不会影响其他事务

  • 隔离级别(从低到高):

    • 读未提交(Read Uncommitted)

    • 读已提交(Read Committed)

    • 可重复读(Repeatable Read)

    • 串行化(Serializable)

4.持久性(Durability)

  • 定义:事务提交后,对数据的修改是永久性的,即使系统故障也不丢失

  • 实现机制:redo log + 刷盘策略

二、ACID的产生背景

技术演进过程:

  1. 早期文件系统:数据一致性差,没有事务概念

  2. 数据库发展初期:需要保证金融、交易等关键业务的可靠性

  3. 理论提出:由Jim Gray等人在1970年代提出并完善

  4. 商业化实现:IBM、Oracle等数据库厂商在1980年代实现

产生原因:

  • 商业应用对数据可靠性的要求

  • 并发操作带来的数据不一致问题

  • 系统故障时的数据恢复需求

三、实际业务场景注意事项

1.隔离级别选择

-- 根据业务需求选择合适的隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 常用选择: -- 1. 读已提交:大多数业务场景,平衡性能与一致性 -- 2. 可重复读:需要保证读一致性(如对账业务) -- 3. 串行化:金融核心交易,但性能代价高

2.事务设计原则

  • 短事务原则:尽量缩小事务范围,减少锁持有时间

    // 不佳示例 - 长事务 @Transactional public void processOrder(Order order) { // 业务逻辑 validate(order); // 校验 save(order); // 保存 notifyUser(); // 通知(可能耗时) // ... 更多操作 } // 优化示例 - 拆分事务 @Transactional public void saveOrder(Order order) { validate(order); save(order); } public void processOrder(Order order) { saveOrder(order); // 核心操作在事务内 notifyUser(); // 耗时操作在事务外 }

    3.死锁预防

-- 常见死锁场景及预防 -- 1. 按固定顺序访问资源 -- 2. 设置合理的锁超时时间 SET innodb_lock_wait_timeout = 50; -- 设置锁等待超时(秒) -- 3. 使用低隔离级别或乐观锁

4.分布式事务考虑

在微服务架构下:

  • 避免分布式事务:通过设计减少跨服务事务

  • 使用最终一致性:Saga、TCC等模式

  • 补偿机制:设计可回滚的业务操作

5.性能优化

  • 索引优化:减少锁范围

  • 批量操作:减少事务数量

  • 读写分离:降低主库压力

  • 连接池配置:合理设置连接数

6.监控与告警

需要监控的关键指标:

1. 事务执行时间 > 阈值(如3秒) 2. 死锁发生频率 3. 锁等待时间 4. 回滚率(异常事务比例) 5. 连接数使用率

四、典型场景实践

电商下单场景:

@Service public class OrderService { @Transactional(isolation = Isolation.READ_COMMITTED) public OrderResult createOrder(OrderRequest request) { try { // 1. 库存检查与扣减(需要锁) inventoryService.reduceStock(request.getSkuId(), request.getQuantity()); // 2. 创建订单记录 Order order = orderMapper.insert(request); // 3. 扣减用户余额 accountService.deductBalance(request.getUserId(), request.getAmount()); // 4. 生成物流单(可异步) logisticsService.createLogistics(order.getId()); return new OrderResult(order, true); } catch (BusinessException e) { // 事务会自动回滚 throw e; } } }

注意事项:

  1. 库存扣减:使用行锁或乐观锁避免超卖

  2. 金额计算:使用Decimal类型,避免浮点数精度问题

  3. 异常处理:明确哪些异常需要回滚事务

  4. 幂等性:接口设计要考虑重复提交问题

五、ACID的局限性

1.性能瓶颈:严格ACID影响并发性能

2.扩展性差:分布式环境下难以保证

3.实际妥协:很多业务使用"基本可用"的弱一致性

4.CAP定理:分布式系统中只能同时满足两个

六、现代数据库的ACID实现差异

数据库ACID实现特点适用场景
MySQL InnoDB完整ACID,MVCC实现OLTP业务
PostgreSQL完整ACID,多版本存储复杂事务
MongoDB支持事务(4.0+)文档型业务
Redis有限支持(乐观锁)缓存、计数器

最佳实践总结

  1. 根据业务特性选择隔离级别,不要盲目使用最高级别

  2. 事务代码尽量简单,避免在事务中包含RPC调用、文件IO等耗时操作

  3. 设计合理的重试机制,处理死锁等临时性故障

  4. 做好监控和告警,及时发现事务相关性能问题

  5. 在分布式架构中,优先考虑最终一致性而非强一致性

  6. 定期进行压力测试,评估事务处理能力

ACID是保证数据一致性的基石,但在实际应用中需要权衡利弊,根据具体业务场景做出合理的设计选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

计算机深度学习毕设实战-基于 人工智能深度学习算法训练数字识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

学长亲荐2026专科生必备10款AI论文写作软件测评

学长亲荐2026专科生必备10款AI论文写作软件测评 2026年专科生论文写作工具测评:为何值得一看 随着人工智能技术的不断进步,AI论文写作工具逐渐成为大学生,尤其是专科生群体中不可或缺的辅助工具。然而,面对市场上琳琅满目的软件选…

含氢气氨气综合能源系统优化调度研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

【课程设计/毕业设计】基于机器学习深度学习算法训练数字识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Spring 三级缓存详解

Spring 的三级缓存是解决单例Bean循环依赖的核心机制。理解三级缓存对于掌握Spring的Bean创建过程至关重要。一、三级缓存定义与作用三级缓存的含义// 在 DefaultSingletonBeanRegistry 中定义 public class DefaultSingletonBeanRegistry extends ... {// 一级缓存&#xff1a…

2025金三银四:大模型训练岗年薪百万技术栈揭秘,非常详细收藏我这一篇就够了!

​​摘要​​ 2025年大模型训练岗位校招薪资峰值突破​​180万​​(OpenAI中国研究院Offer),较算法工程师均值高出​​300%​​。本文基于猎聘/脉脉35家头部企业招聘数据,深度解析百万年薪背后的​​技术能力图谱​​:…

前端Vue开发环境搭建(安装Node.js)

一、官网下载Node.js下载地址https://nodejs.org/zh-cn​​​​二、测试安装是否成功在键盘按下【winR】键,输入cmd,然后回车,打开cmd窗口分别输入node -v和npm -v,测试安装是否成功(Node.js已经整合了npm)…

Azure Dataverse 权限设计学习

1. 创建表 https://make.powerapps.com/ 2. 管理员配置权限端 https://admin.powerplatform.microsoft.com/ 3 Dataverse 权限设计 业务部门 -> 相当于组织架构 团队 -> 组织架构的分组权限,可以把业务部门下的人员放在多个团队 用户 -> 职员 角色 -…

分布式事务原理及实际业务场景详解

一、分布式事务基础概念1.1 什么是分布式事务?分布式事务是指跨多个数据库、服务或系统的操作序列,这些操作作为一个整体,要么全部成功,要么全部失败,保证数据的一致性。1.2 本地事务 vs 分布式事务维度本地事务分布式…

基于JAVA框架的学生宿舍寝室报修管理系统的设计与实现应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着高校规模的扩大和学生人数的增加,宿舍设施的维护与管理成为一项重要任务。传…

【SCI复现】基于RSSA算法的冷热电联供型微网优化调度附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

车辆GPS数据实战方案:SpringBoot + Kafka + Redis + MongoDB 全栈实现

1. 系统架构设计 1.1 整体架构 车辆终端 → SpringBoot接入层 → Kafka消息队列 → 数据处理层 → MongoDB存储 + Redis缓存 1.2 技术栈选择理由 技术 作用 选择理由 SpringBoot 接入层、快速开发 生态丰富、快速开发 Kafka 消息队列,高吞吐 解耦系统组件、支持顺序消息 Re…

力扣数据库——员工奖金

员工奖金https://leetcode.cn/problems/employee-bonus/ 一 题目 表:Employee Column NameTypeempIdintnamevarcharsupervisorintsalaryint empId 是该表中具有唯一值的列。该表的每一行都表示员工的 id 和姓名,以及他们经理的 id 和他们的工资。表…

基于Java的心理咨询在线评测系统设计与开发应用和研究

文章目录心理咨询在线评测系统设计与开发摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!心理咨询在线评测系统设计与开发摘要 该系统基于Java技术栈开发&…

毫米波V2I网络的链路层仿真研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

把智能体当“新员工“带:一文搞懂大模型智能体运作流程

文章通过将智能体比作新员工的形象比喻,揭示了智能体的运作流程:首先通过系统提示词设定角色和基本信息,然后配置工具让智能体使用。智能体会尝试解决问题,但结果可能不完善,需要根据反馈优化。ReAct Agent模型通过规划…

高并发订单系统架构设计:Redis + MySQL + Elasticsearch 实践

1000万日订单查询优化:冷热分离与分层缓存全攻略 面对每日 10,000,000 条订单查询,本文提供系统化的优化方案,涵盖缓存策略、数据库分库分表、历史归档、查询路由与降级策略、容量规划及生产级运维实践,同时提供 Java 完整示例代码,便于落地实现。 架构总览 一、应用层缓存…

基于Java的银行储蓄存业务系统的设计与实现应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 银行储蓄业务系统是金融信息化建设的重要组成部分,基于Java技术开发的系统能够有…

力扣数据库——第二高的薪水

第二高的薪水https://leetcode.cn/problems/second-highest-salary/ 一 题目 Employee 表: Column NameTypeidintsalaryint id 是这个表的主键。表的每一行包含员工的工资信息。查询并返回 Employee 表中第二高的 不同 薪水 。如果不存在第二高的薪水&#xff0c…