news 2026/5/1 9:16:17

基础-事务

作者头像

张小明

前端开发工程师

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/5/1 6:28:19

YOLO模型冷热数据分离:长期存储与即时访问的平衡

YOLO模型冷热数据分离:长期存储与即时访问的平衡 在智能制造工厂的视觉质检线上,一个看似简单的请求——“切换到上个月的YOLOv8模型进行复检”——却可能让系统卡顿数分钟。原因并不复杂:边缘设备本地存储早已被高频调用的主模型占满&#x…

作者头像 李华
网站建设 2026/4/30 20:59:01

YOLO模型远程调试技巧:通过SSH连接GPU服务器

YOLO模型远程调试技巧:通过SSH连接GPU服务器 在智能安防摄像头实时识别可疑行为、自动驾驶车辆毫秒级响应路况变化的今天,深度学习工程师面临的最大挑战之一,早已不是算法本身,而是——如何让这些庞大的YOLO模型真正跑起来。 本地…

作者头像 李华
网站建设 2026/5/1 6:11:22

YOLO模型特征图可视化:理解网络关注区域的方法

YOLO模型特征图可视化:理解网络关注区域的方法 在工业质检线上,一台搭载YOLO模型的摄像头正高速扫描PCB板。它每秒能处理30帧图像,准确识别出焊点缺陷——但工程师却发现,系统频繁将正常焊盘误判为异物。问题出在哪里?…

作者头像 李华
网站建设 2026/4/30 10:55:13

计算机毕设java药房药品销售系统的设计与实现 基于Java的药房药品销售管理系统的设计与开发 Java环境下药房药品销售信息化管理系统的实现

计算机毕设java药房药品销售系统的设计与实现28h1d9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展和人们生活方式的改变,传统的药房药品销…

作者头像 李华
网站建设 2026/5/1 8:34:33

计算机毕设java中医古方名方信息管理系统 基于Java的中医经典方剂信息管理平台设计与实现 Java技术驱动的中医古方信息管理系统开发

计算机毕设java中医古方名方信息管理系统na36l9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,传统中医文化的传播与管理方式也迎来了新的…

作者头像 李华
网站建设 2026/5/1 6:08:59

ABC round 438 E st倍增

Problem StatementThere are N people and N buckets. Both the people and buckets are numbered 1,2,…,N.Initially, person i holds only bucket i, and bucket i is empty.From now on, the following operation will be performed 109 times:For i1,2,…,N simultaneousl…

作者头像 李华