第8次作业-事物的的例子实现及演示

发布时间 2023-11-12 20:37:58作者: 史迪仔ww
这个作业属于哪个课程 https://edu.cnblogs.com/campus/uzz/cs3
这个作业要求在哪里 https://edu.cnblogs.com/campus/uzz/cs3/homework/13102
这个作业的目标 第8次作业-事物的的例子实现及演示

【例6-2】假设银行存在两个借记卡账户(account)李三与‘王五,要求这两个借记卡账户不能用于透支,即两个账户的余额 (balance) 不能小于0。
创建存储过程tran procO, 实现两个账户的转账业务。

CREATE TABLE account(
account_no INT auto_increment frimary key,
account_name VARCHAR(10) NOT NULL,
balance INT UNSIGNED);
select * from account;
delimiter @@
CREATE PROCEDURE tran_proc(IN from_account INT,
                           IN to_account INT,
						   IN money INT)
 BEGIN
    DECLARE CONTINUE HANDLER FOR 1690
		BEGIN
		  SELECT '余额小于0'信息;
			 ROLLBACK;
 END;
 START TRANSACTION;
 UPDATE accunt SET balance=balance+money WHERE account_no=to_account;
 UPDATE accunt SET balance=balance-money WHERE account_no=from_account;
 COMMIT;
 END @@
 delimirer;
 CALL tran_proc(1,2,800);
 SELECT * FROM accunt;
 CALL tran_proc(1,2,800);
 SELECT * FROM accunt;




【例6-3】示例。下面创建的两个存储过程,分别对在同一个事务中创建两个账号相同的银行账户进行的不同处理。

CREATE DEFINER=`root`@`localhost` PROCEDURE `save_p1_proc`()
begin 
declare CONTINUE HANDLER FOR 1062
BEGIN
ROLLBACK TO b;
end;
start TRANSACTION;
INSERT INTO accunt VALUES(null,'赵四',1000);
SAVEPOINT b;
#last_insert_id()获取赵四账户的账户
INSERT into accunt VALUES(last_insert_id(),'钱六',1000);
COMMIT;
END
CALL save_p1_proc();
SELECT * FROM accunt;
DELETE FROM accunt WHERE account_no=3;
SELECT * from accunt;
CREATE DEFINER=`root`@`localhost` PROCEDURE `save_p2_proc`()
BEGIN
DECLARE CONTINUE HANDLER FOR 1062
BEGIN
ROLLBACK TO b;
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO accunt VALUES(null,'赵四',1000);
SAVEPOINT b;
INSERT INTO accunt VALUES(LAST_INSERT_ID(),'钱六',1000);
COMMIT;
END
CALL save_p2_proc();
SELECT * FROM accunt;


1.创建accunt表,设置三个字段,插入李三,王五两条记录,然后创建tran proc的存储过程,其中设置了int型的三个参数,
之后利用declare语句声明一个handler,作用是当执行的代码块出现1690异常时,出发handler,返回begin下方语句,从st
arttransaction 开始事务,利用update..set 实现对李三,王五余额的更新,当account no =to account时,balance=
原来值加money,当a no=from a时,balance=原来值-money,最后利用commit提交事务。用call调用存储过程,1赋值给f 
a,2赋值给t a,800赋值给money,所以李三为200,王五为800,当再次调用存储过程时,李三余额不足触发handler,输出
余额小于0,并回滚事务。
2.(1)创建存储过程,声明handler当出现异常执行begin和end之间的语句,回滚事务到b,开始事务,插入赵四,保存b,插
入钱六LAST_INSERT_ID()获取赵四的信息,所以钱六与赵四信息相同,提交事务,调用存储过程,因为信息相同,导致主键冲突
,触发handler,回到第一个insert,提交了第一个insert。
(2)删除表中a n=3记录,创建存储过程,声明handler,出现异常1062执行begin下面的语句,插入赵四记录,保存b,插
入钱六LAST_INSERT_ID()获取赵四的信息,所以钱六与赵四信息相同,主键冲突,触发handler,提交事务,调用存储过程,查
询后发现赵四的记录没被撤销。