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

发布时间 2023-11-12 21:54:12作者: 慕言ya

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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/uzz/cs3
这个作业要求在哪里 https://edu.cnblogs.com/campus/uzz/cs3/homework/13102
这个作业的目标 事物的的例子实现及演示

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

(1)建立account表(插入相关数据)并创建存储过程:
#建立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);  #向该表中插入李三的账户的信息
INSERT INTO account VALUES(NULL, '王五', 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信息' ; 
      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 ;

(2)调用存储过程并查询account表账户信息:
CALL tran_proc(1, 2, 800);  #调用存储过程,要求从账户1向账户2进行转账800
SELECT * FROM account;  #查询account表的账户信息

(3)继续调用存储过程:
CALL tran_proc(1,2,800);

(4)最后查询account表账户信息:
select * FROM account;

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

(1)创建save_p1_proc,仅撤销第二条INSERT语句,提交了第一条INSERT语句:
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); #向account表中插入相关记录
    SAVEPOINT b;                      #设置保存点
    INSERT INTO account VALUES(last_insert_id(), '钱六', 1000); #向account表中插入相关记录(其中last_insert_id()获取'赵四'账户的账号)
   COMMIT; #提交事务
 END @@
 
DELIMITER;
CALL save_p1_proc();
select * from account;

(2)创建存储过程save_p2_proc,先撤销第二条INSERT语句,然后撤销所有的INSERT语句:
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); #向account表中插入相关记录
    SAVEPOINT b;                  #设置保存点
    INSERT INTO account VALUES(last_insert_id(), '钱六', 1000); #向account表中插入相关记录
   COMMIT;
 END @@
 
DELIMITER ;
CALL save_p2_proc();
SELECT * FROM account;