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

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

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

相关推荐
等....1 天前
Minio使用
数据库
龙文浩_1 天前
Attention Mechanism: From Theory to Code
人工智能·深度学习·神经网络·学习·自然语言处理
win x1 天前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
守护安静星空1 天前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ljt27249606611 天前
Compose笔记(七十七)--视频录制
笔记·android jetpack
迷枫7121 天前
DM8 数据库安装实战:从零搭建达梦数据库环境(附全套工具链接)
数据库
XDHCOM1 天前
PostgreSQL 25001: active_sql_transaction 报错原因分析,故障修复步骤详解,远程处理解决方案
数据库·sql·postgresql
爱上好庆祝1 天前
svg图片
前端·css·学习·html·css3
嵌入式小企鹅1 天前
蓝牙学习系列(八):BLE L2CAP 协议详解
网络·学习·蓝牙·ble·协议栈·l2cap
卤炖阑尾炎1 天前
PostgreSQL 日常运维全指南:从基础操作到备份恢复
运维·数据库·postgresql