这个作业属于哪个课程 | https://edu.cnblogs.com/campus/uzz/cs3 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/uzz/cs3/homework/13102 |
这个作业的目标 | 第8次作业-事物的的例子实现及演示 |
【例6-2】假设银行存在两个借记卡账户(account)李三与‘王五,要求这两个借记卡账户不能用于透支,即两个账户的余额 (balance) 不能小于0。创建存储过程tran procO, 实现两个账户的转账业务。
# 建立account表
CREATE TABLE account(
account_no INT AUTO_INCREMENT PRIMARY KEY, -- 账户号,自增长,主键
account_name VARCHAR(10) NOT NULL, -- 账户名,长度不超过10个字符,不能为空
balance INT UNSIGNED -- 余额,无符号整数,不能取负值
);
# 向account表插入记录
INSERT INTO account VALUES(NULL, '李三', 1000); -- 向表中插入李三的账户信息,初始余额1000
INSERT INTO account VALUES(NULL, '王五', 1000); -- 向表中插入王五的账户信息,初始余额1000
# 创建存储过程 tran_proc, 实现转账业务
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信息' ; -- 当余额小于0时,输出信息
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); -- 调用存储过程进行从账户1向账户2转账800
SELECT * FROM account; -- 查询账户表的内容
CALL tran_proc(1,2,800);
select * FROM account;
运行结果:
【例6-3】示例。下面创建的两个存储过程,分别对在同一个事务中创建两个账号相同的银行账户进行的不同处理。
DELIMITER @@
CREATE PROCEDURE save_p1_proc()
BEGIN
DECLARE CONTINUE HANDLER FOR 1062
BEGIN
ROLLBACK TO b; -- 事务回滚到保存点b
END;
START TRANSACTION; -- 开始事务
INSERT INTO account VALUES(null, '赵四', 1000); -- 向账户表中插入记录,null代表自增主键
SAVEPOINT b; -- 设置保存点
INSERT INTO account VALUES(last_insert_id(), '钱六', 1000); -- 向账户表中插入记录,使用了上一个自增主键的值
COMMIT; -- 提交事务
END @@
DELIMITER;
CALL save_p1_proc();
select * from account;
运行结果:
delete from account where account_no=3;
select * from account;
DELIMITER @@
CREATE PROCEDURE save_p2_proc()
BEGIN
DECLARE CONTINUE HANDLER FOR 1062
BEGIN
ROLLBACK TO b; -- 事务回滚到保存点b
ROLLBACK; -- 整个事务回滚
END;
START TRANSACTION; -- 开始事务
INSERT INTO account VALUES(null, '赵四', 1000); -- 向账户表中插入记录,null代表自增主键
SAVEPOINT b; -- 设置保存点
INSERT INTO account VALUES(last_insert_id(), '钱六', 1000); -- 向账户表中插入记录,使用了上一个自增主键的值
COMMIT;-- 没有COMMIT,因此整个事务会被回滚
END @@
DELIMITER ;
CALL save_p2_proc();
select * from account;
运行结果: