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

[复制链接]
发表于 2025-9-17 19:42:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.内容:

基于现有数据库筹划查抄点实验,观察比力提交前后实验结果并分析。
2.实现

源码
  1. -- 开启事务
  2. START TRANSACTION;
  3. -- 插入一条订单记录(客户ID为10002)
  4. INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);
  5. -- 获取生成的订单号
  6. SET @order_id := LAST_INSERT_ID();
  7. -- 插入第1条订单项(A003)
  8. INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
  9. VALUES (@order_id, 1, 'A001', 2, 5.99);
  10. -- 设置保存点S1
  11. SAVEPOINT S1;
  12. -- 插入第2条订单项(A002)
  13. INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
  14. VALUES (@order_id, 2, 'A002', 1, 3.50);
  15. -- 设置保存点S2
  16. SAVEPOINT S2;
  17. -- 插入第3条订单项(A001)
  18. INSERT INTO orderitems (o_num, o_item, f_id, quantity, item_price)
  19. VALUES (@order_id, 3, 'A003', 5, 4.20);
  20. -- 设置保存点S3
  21. SAVEPOINT S3;
  22. -- 回滚到保存点S2(撤销A001插入)
  23. ROLLBACK TO S2;
  24. -- 提交事务,最终只保留 A003 和 A002 两条记录
  25. COMMIT;
  26. -- 查询确认结果
  27. 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 语句之前,导致纵然回滚也不会打消之后的插入利用。
调解语句次序为“插入后设置生存点”后,回滚举动符合预期,乐成打消了指定利用。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表