实验11.1 设计并执行事务
【实验目的】
①理解事务的概念。
②理解COMMIT语句的含义。
③理解ROLLBACK语句的含义。
④掌握简单事务的创建和运行方法。
【实验内容】
①创建一个事务,使它正常提交并进行测试:将顾客Tip Top的订单全部转让给代理商Jones。
②创建一个事务,使它回滚并进行测试:增加代理商编号为“a07”的信息。
③设计并执行复杂事务:顾客ACME通过代理商Jones打算订购pen商品500件,根据要求,该商品最多只有10 000件,问Jones是否能够订购到该商品,给出结果提示。如果订购成功,把订购的商品插入到数据库中。
【实验步骤】
(1)创建一个事务,使其正常提交
创建一个事务,使它正常提交并进行测试:将顾客Tip Top的订单全部转让给代理商Jones。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②输入订单查询语句,查看顾客Tip Top的所有订单信息,如图11.1所示。
USE sales;
SELECT ordno,orders.cid,cname,orders.aid,aname,pid,qty,dollars
FROM orders,customers,agents
WHERE orders.aid=agents.aid and orders.cid=customers.cid and cname='Tip Top';

图11.1 执行事务前的订单数据
③新建一个查询窗口,输入下面的SQL语句:
START TRANSACTION;
USE sales;
UPDATE orders SET aid=(SELECT aid FROM agents WHERE aname='Jones')
WHERE cid=(SELECT cid FROM customers WHERE cname='Tip Top');
COMMIT;
SELECT * FROM orders;
④单击工具栏中的
按钮,执行窗口中的SQL语句,如图11.2所示。
⑤再次运行图11.1的SQL语句,进行订单查询,查看顾客Tip Top的所有订单信息,如图11.3所示,同时比较图11.1和图11.3的结果。

图11.2 执行事务后的订单数据
(2)创建一个事务,使其回滚
创建一个事务,将它回滚并进行测试:增加代理商编号为“a07”的信息。
①在图标菜单中单击第一个图标
,新建一个查询窗口。(https://www.daowen.com)
②查看表agents的数据,输入查询语句执行,如图11.3所示。

图11.3 查询执行事务前的代理商信息
③新建一个查询窗口,输入下面的SQL语句:
START TRANSACTION;
USE sales;
INSERT INTO agents VALUES ('a07','mary','Dallas',5);
SELECT ("已经插入代理商a07的信息!") as '';
ROLLBACK;
④单击工具栏中的
按钮,执行窗口中的SQL语句,如图11.4所示。

图11.4 执行事务
⑤再次查看表agents的数据,输入查询语句并执行,如图11.5所示。比较图11.3和图11.5,发现代理商表中并没有插入新行,原因是虽然在执行事务时,插入了新行,但是事务最后执行了ROLLBACK语句,又回滚到事务执行之前的状态,即插入行语句被撤销。

图11.5 执行事务后的代理商信息
(3)设计并执行复杂事务
设计并执行复杂事务:顾客ACME通过代理商Jones打算订购pen商品500件,根据要求,该商品最多只有10 000件,问Jones是否能够订购到该商品,给出结果提示。如果订购成功,把订购的商品插入到数据库中。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②在查询窗口,输入下面的SQL语句并执行,如图11.6所示。
SET autocommit=0; /*关闭自动提交*/
DELIMITER $$
CREATE PROCEDURE ord_pro()
BEGIN
SET @Prod_num = 500;
SET @cid= (SELECT cid FROM customers WHERE cname='ACME');
SET @aid= (SELECT aid FROM agents WHERE aname='Jones');
SET @pid= (SELECT pid FROM products WHERE pname='pen');
SET @ordno1 = (SELECT MAX(ordno) FROM orders);
SET @ordno2=@ordno1+1;
SET @Ord_num = (SELECT SUM(qty) FROM orders WHERE pid=@pid);
IF @Ord_num+@Prod_num <10000 THEN
BEGIN
START TRANSACTION;
INSERT INTO orders(ordno,aid,pid,cid,qty)
VALUES (@ordno2, @aid, @pid, @cid, @prod_num);
COMMIT;
SELECT ("Jones订购商品pen成功!") as '';
END;
ELSE
BEGIN
ROLLBACK;
SELECT ("该商品已经被订购完,Jones不能再订购!") as '';
END;
END IF;
END $$
DELIMITER ;

图11.6 执行复杂事务
③调用存储过程,查看表orders的数据,如图11.7所示。查看该商品的订单信息已经存在。

图11.7 执行复杂事务的订单数据