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

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

视频链接:https://www.bilibili.com/video/BV1Uu4y1t7aE/?vd_source=0c00080c1f3cb7898dd30629cdac8ce0

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

#建立 account 表
create table account (
account_no int auto_increment primary key,
account_name varchar(10) not null,
balance int unsigned 
);
# 向account 表中插入记录
insert into account values(null,'李四',1000);
insert into account values(null,'王五',1000);
#创建存储过程
delimiter @@
create procedure tran_proc(in from_account int,in to_account int ,in money int)

BEGIN
DECLARE CONTINUE HANDLER for 1690 #1690报错即减法的结果超过mysql数值字段的范围,也就是说 当两个账号的余额小于0时
BEGIN 
select '余额小于零'信息;
ROLLBACK;   #回滚事务,即结束用户的事务,撤销正在进行所有提交的修改
END;

START transaction;  #开始事务
UPDATE account SET balance =balance + money  #当用户的账号为收账的账号时,收账的这个账号的余额就会加上转入的金额
where account_no=to_account;
update account set balance =balance-money  # 当用户的账号为转账的账号时,转账的这个账号的余额就会减去转出的金额
where account_no=from_account;
commit;   #提交事务
END@@

delimiter;
call tran_proc(1,2,800);
select * from account;

call tran_proc(1,2,800);

select * from account;

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

delimiter @@
create procedure save_p1_proc()
begin 
declare continue HANDLER for 1062 #1062报错即插入了重复主键的语句
BEGIN
rollback  to b; # 事务回滚到保存点b
end;
start TRANSACTION; #开始事务
insert into account values(null,'赵四',1000);
SAVEPOINT b; #设置b保存点

commit;
insert into account values(last_insert_id(),'钱六',1000);
END@@

delimiter;
call save_p1_proc();
select * from account; #撤销了第二条insert语句,提交第一条insert语句