学习笔记:数据库——事务

1.内容:

基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。

2.实现

源码

复制代码
-- 开启事务
START TRANSACTION;

-- 插入一条订单记录(客户ID为10002)
INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);

-- 获取生成的订单号
SET @order_id := LAST_INSERT_ID();

-- 插入第1条订单项(A003)
INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
VALUES (@order_id, 1, 'A001', 2, 5.99);

-- 设置保存点S1
SAVEPOINT S1;

-- 插入第2条订单项(A002)
INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
VALUES (@order_id, 2, 'A002', 1, 3.50);

-- 设置保存点S2
SAVEPOINT S2;

-- 插入第3条订单项(A001)
INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
VALUES (@order_id, 3, 'A003', 5, 4.20);

-- 设置保存点S3
SAVEPOINT S3;

-- 回滚到保存点S2(撤销A001插入)
ROLLBACK TO S2;

-- 提交事务,最终只保留 A003 和 A002 两条记录
COMMIT;

-- 查询确认结果
SELECT * FROM orderitems WHERE o_num = @order_id;

运行测试结果截图:

事务rollback TO S2之前 缓冲区的orders表格:

事务rollback TO S2之后 缓冲区的orders表格:

解释原因:

具体执行顺序如下:

1.插入订单主表数据(orders),生成订单号

2.插入三条订单明细(orderitems):分别为 A001、A002 和 A003;

3.每插入一条订单项后设置一个保存点(S1、S2、S3);

4.执行 ROLLBACK TO S2,表示撤销从保存点 S2 之后的所有操作,也就是撤销了 A003 的插入;

5.执行 COMMIT 提交事务,此时数据库中只保留在 S2 之前成功执行的操作:A001 和 A002。

之所以插入的 A001 数据没有被提交,是因为它发生在保存点 S2 之后,回滚到 S2 时被撤销了。回滚不会影响 S2 之前已执行的 SQL 语句。

2.实验中产生的错误及原因分析

在使用 ROLLBACK TO 保存点 时,曾出现"保存点回滚后数据异常"的情况。

原因在于误将 SAVEPOINT 放在 INSERT 语句之前,导致即使回滚也不会撤销之后的插入操作。

调整语句顺序为"插入后设置保存点"后,回滚行为符合预期,成功撤销了指定操作。

相关推荐
QQ_4376643141 小时前
Redis协议与异步方式
数据库·redis·bootstrap
纪莫1 小时前
技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)
数据库·java面试⑧股
凉、介1 小时前
深入 QEMU Guest Agent:虚拟机内外通信的隐形纽带
c语言·笔记·学习·嵌入式·虚拟化
崇山峻岭之间1 小时前
Matlab学习记录31
开发语言·学习·matlab
Nerd Nirvana1 小时前
数据库模型全景:从原理到实践的系统性指南
数据库·oracle·电力行业
SelectDB1 小时前
从 Greenplum 到 Doris:集群缩减 2/3、年省数百万,度小满构建超大规模数据分析平台经验
数据库·数据分析·apache
alonewolf_992 小时前
MySQL索引优化实战二:分页、关联查询与Count优化深度解析
数据库·mysql
石像鬼₧魂石2 小时前
22端口(OpenSSH 4.7p1)渗透测试完整复习流程(含实战排错)
大数据·网络·学习·安全·ubuntu
njsgcs2 小时前
SIMA2 论文阅读 Google 任务设定器、智能体、奖励模型
人工智能·笔记
TDengine (老段)2 小时前
TDengine Python 连接器进阶指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据