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语句