基础-事务

一、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 ;

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

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

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

相关推荐
ma_king12 分钟前
入门 java 和 数据库
java·数据库·后端
jiayou644 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云4 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
NineData15 小时前
NineData 迁移评估功能正式上线
数据库·dba
tingshuo291715 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
NineData21 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师1 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石1 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库