马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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 语句之前,导致纵然回滚也不会打消之后的插入利用。
调解语句次序为“插入后设置生存点”后,回滚举动符合预期,乐成打消了指定利用。
|