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

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 语句之前,导致即使回滚也不会撤销之后的插入操作。

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

相关推荐
蒸蒸yyyyzwd2 小时前
cpp对象模型学习笔记1.1-2.8
java·笔记·学习
银发控、2 小时前
MySQL联合索引
数据库·mysql
阿蒙Amon2 小时前
TypeScript学习-第7章:泛型(Generic)
javascript·学习·typescript
予枫的编程笔记2 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
Hill_HUIL2 小时前
学习日志23-路由高级特性(静态路由)
网络·学习
dalong102 小时前
A14:自定义动画演示
笔记·aardio
今儿敲了吗3 小时前
鸿蒙开发第一章学习笔记
笔记·学习·鸿蒙
闪闪发亮的小星星3 小时前
刚体运动学复习笔记
笔记
一起养小猫4 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你4 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试