基础-事务

一、MySQL基础

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

1. 事务

1.1 事务的简介

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

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

------《数据库事务详解》

1.2 事务操作

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

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

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

sql 复制代码
-- ---------------------------- 事务操作 ----------------------------
-- 数据准备
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;
sql 复制代码
-- 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 事务的隔离级别

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

sql 复制代码
-- 查看事务隔离级别
select @@transaction_isolation;

-- 设置事务隔离级别
set session transaction isolation level read uncommitted ;

set session transaction isolation level repeatable read ;

"事务不是数据库的负担,而是数据库的保障。"

------《数据库事务的本质》

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

相关推荐
xxxmine2 小时前
ConcurrentHashMap 和 Hashtable 的区别详解
java·开发语言
luoluoal2 小时前
基于python的自然语言处理技术的话题文本分类的研究(源码+文档)
python·mysql·django·毕业设计·源码
阿猿收手吧!2 小时前
【C++】brpc与grpc对比
开发语言·c++
weixin_436525072 小时前
NestJS-TypeORM QueryBuilder 常用 SQL 写法
java·数据库·sql
Cosolar2 小时前
MySQL EXPLAIN 执行计划分析:能否查看 JOIN 关联顺序
数据库·后端·mysql
会员果汁2 小时前
算法-拓扑排序-C
c语言·开发语言·算法
wangchen_02 小时前
深入理解 C/C++ 强制类型转换:从“暴力”到“优雅”
java·开发语言·jvm
micromicrofat2 小时前
【MongoDB】WSL2访问宿主机的MongoDB
数据库·mongodb
两拆2 小时前
Redhat7.9安装部署Oracle 19C
数据库·oracle