news 2026/4/18 10:50:28

基础-事务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基础-事务

一、MySQL基础

在数据的世界里,就像银行系统中的一笔转账操作,我们不能接受"资金从A账户划出,但B账户未收到"的混乱局面。事务正是数据库中的"安全卫士",确保数据操作的完整性与可靠性。当您在电商网站下单时,系统需要同时更新库存、创建订单、扣除余额——这些操作必须全部成功或全部失败,否则数据库将处于不一致状态。事务就是解决这种"要么全有,要么全无"问题的完美方案。

1. 事务

1.1 事务的简介

事务是数据库管理系统(DBMS)中一个逻辑工作单元,由一组操作组成,这些操作要么全部成功执行,要么全部失败回滚,以确保数据库的一致性。

"事务是数据库中一个不可分割的工作单元,它将多个数据库操作视为一个整体。"
——《数据库事务详解》

1.2 事务操作

事务是默认提交的,之前我们写的单挑sql语句就默认是一条语句的事务。

select @@autocommit; 如果为1,就是自动提交,否则为0则是手动提交;

可以通过手动设置更改提交方式。

-- ---------------------------- 事务操作 ---------------------------- -- 数据准备 create table account( id int auto_increment primary key comment '主键ID', name varchar(10) comment '姓名', money int comment '余额' ) comment '账户表'; insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000); -- 恢复数据 update account set money = 2000 where name = '张三' or name = '李四'; -- case1: 通过手动修改提交事务的方法控制提交数据 select @@autocommit; set @@autocommit = 1; -- 设置为手动提交 -- 转账操作(张三转给李四1000) -- 1. 查询张三账户余额 select * from account where name ='张三'; -- 2. 将张三账户的余额-1000 update account set money = money-1000 where name = '张三'; -- 程序抛出异常... -- 3. 将李四账户的余额+1000 update account set money = money+1000 where name = '李四'; -- 如果没有提交事务,数据库则不会更新数据 -- 提交事务 commit; -- 如果有执行错误或者报错,就应该回滚事务 rollback;

-- case2: 手动提交事务 -- 开启事务 start transaction; -- 进行事务操作: -- 1. 查询张三账户余额 select * from account where name = '张三'; -- 2. 将张三账户余额-1000 update account set money = money - 1000 where name = '张三'; -- 程序执行报错 ... -- 3. 将李四账户余额+1000 update account set money = money + 1000 where name = '李四'; -- 如果所有的事务执行成功,我们提交事务 commit; -- 否则我们就回滚事务 rollback;

1.3 事务的四大特性

事务的四大特性(ACID)是其核心价值所在,它们共同确保了数据的完整性和可靠性。

1. 原子性(Atomicity)

定义:事务是一个不可分割的工作单元,其中的所有操作要么全部成功,要么全部失败回滚。

生动案例
银行转账操作如同一个"黑箱",用户无需关心内部细节。如果转账过程中系统崩溃,整个事务将回滚,A账户不会被扣款,B账户也不会被加款。

技术实现:通过回滚日志(Rollback Log)实现。系统记录每个操作的前状态,如果事务失败,系统可以恢复到事务开始前的状态。

2. 一致性(Consistency)

定义:事务必须使数据库从一个一致性状态转换到另一个一致性状态,保证数据的完整性。

生动案例
在银行转账中,一致性意味着"转账前后,两个账户的总金额保持不变"。如果A账户减少1000元,B账户必须增加1000元,总金额不变。

技术实现:通过数据库的完整性约束(如主键、外键、唯一性约束)和业务逻辑来保证。

3. 隔离性(Isolation)

定义:并发执行的事务之间相互隔离,一个事务的中间状态对其他事务不可见。

生动案例
当您查看银行账户余额时,系统不会显示"正在转账中的临时状态"(如A账户已扣款但B账户未到账)。隔离性确保了您看到的是一个稳定、一致的账户状态。

技术实现:通过锁机制(如共享锁、排他锁)和隔离级别(Read Uncommitted、Read Committed、Repeatable Read、Serializable)来实现。

4. 持久性(Durability)

定义:一旦事务提交,其结果将永久保存在数据库中,即使系统发生故障也不会丢失。

生动案例
当您确认完成转账后,系统会返回"转账成功"的提示。即使在转账后系统立即崩溃,您的账户余额也会正确反映这次转账。

技术实现:通过日志(Write-Ahead Logging)和检查点(Checkpoint)机制实现。系统先将事务的修改记录到日志,再更新数据库,确保崩溃后能从日志恢复。

1.4 事务的生命周期

事务的执行过程遵循明确的生命周期阶段:

阶段说明业务场景
活动(Active)事务开始执行,正在处理数据库操作用户提交订单,系统开始处理
部分提交(Partially Committed)事务执行到最后一条语句,但尚未提交订单信息已写入,但库存未更新
失败(Failed)事务中发生错误,无法继续库存不足,无法完成订单
中止(Aborted)事务失败并回滚,数据恢复到事务前状态系统自动回滚,用户未被扣款
提交(Committed)事务成功完成,结果永久保存订单成功创建,库存已更新

1.5 事务并发问题

在多用户环境中,事务并发执行可能导致问题,如:

  • 脏读(Dirty Read):读取了未提交的数据
  • 不可重复读(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致
  • 幻读(Phantom Read):同一事务中,查询结果集的行数不一致

1.6 事务的隔离级别

级别从上往下越来越高,性能反之。

-- 查看事务隔离级别 select @@transaction_isolation; -- 设置事务隔离级别 set session transaction isolation level read uncommitted ; set session transaction isolation level repeatable read ;

"事务不是数据库的负担,而是数据库的保障。"
——《数据库事务的本质》

在现代数据库系统中,事务是确保数据一致性和可靠性的基石。无论是在银行系统、电商网站还是社交平台,事务都在默默工作,确保您的每一笔交易、每一条消息都准确无误。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:03:45

YOLO与CI/CD流水线整合:自动化测试与部署实践

YOLO与CI/CD流水线整合:自动化测试与部署实践 在智能制造工厂的质检线上,一台AOI(自动光学检测)设备突然开始频繁漏检微小裂纹。过去,这个问题可能需要工程师手动收集新样本、重新训练模型、导出权重、登录边缘设备替换…

作者头像 李华
网站建设 2026/4/18 5:24:41

YOLO模型输出后处理优化:自定义NMS与坐标转换技巧

YOLO模型输出后处理优化:自定义NMS与坐标转换技巧 在现代工业视觉系统中,YOLO(You Only Look Once)系列目标检测模型早已成为实时感知的基石。从产线缺陷识别到自动驾驶环境感知,其“一次前向推理完成检测”的高效设计…

作者头像 李华
网站建设 2026/4/18 5:26:22

Java面试必看:如何让Main线程成为最后一个退出的秘密!

文章目录Java面试必看:如何让Main线程成为最后一个退出的秘密!一、问题背景:为什么我们要关心Main线程的退出顺序?二、常见的误区:为什么直接运行代码会导致Main线程提前退出?示例代码:原因分析…

作者头像 李华
网站建设 2026/4/18 7:03:35

YOLO模型评估指标解读:mAP、F1、IoU到底怎么看?

YOLO模型评估指标解读:mAP、F1、IoU到底怎么看? 在工业质检线上,一台搭载YOLOv8的视觉系统正高速扫描PCB板。屏幕上不断跳动着“缺陷”标签——但工程师却发现,同一块板子被反复标记出位置略有偏移的多个框,而某些真实…

作者头像 李华
网站建设 2026/4/18 6:25:13

YOLO模型输入分辨率选择:越高越好吗?实测告诉你答案

YOLO模型输入分辨率选择:越高越好吗?实测告诉你答案 在工业质检线上,一台搭载YOLOv5的视觉系统正高速运转——每秒处理30帧图像,检测PCB板上的微型元件。突然,一个仅占2像素的电阻缺失未被识别,导致整批产品…

作者头像 李华
网站建设 2026/4/18 6:24:38

sifu 小身高角色mod制作经验

用角色本来的骨架套小角色,小身高角色不动的时候会有变大问题 解决办法 解包密钥 0x40A266F41FDBCE91312FBB86060D2E9425B7D922C0CF0031F634CAD9AECB49DA blender用小孩的psk 导出fbx还是叫原来的名字 就可以解决 https://www.bilibili.com/video/BV1ixv6BhECQ

作者头像 李华