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

发布时间 2023-11-12 22:49:46作者: DingCL

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

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

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

创建表


create table account (
account_no int auto_increment primary key,
account_name varchar(10) not null,
balance int unsigned 
);

向表中添加俩条数据

INSERT INTO account VALUES(null,'李三',1000);
INSERT INTO account VALUES(null,'王五',1000);

创建存储过程(此处关于数据库1609的异常错误是关于不能出现负数,否则会出现ERROR1609)

在此处的关于对异常处理,才是对实现转账余额不能小于0的关键所在,正式通过它,才实现了我们所需要的事务回滚


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 @@

调用存储过程并查看结果

从李三账户转入王五账户800并查看结果

DELIMITER ;
call tran_proc(1,2,800);
SELECT * FROM account;

再次从李三账户转入王五账户800并查看结果,发现提示信息,原因是李三的余额小于0了

CALL tran_proc(1,2,800);
SELECT * FROM account;

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

第一个存储过程(此处的mysql异常错误是1062:重复键值)


DELIMITER @@
CREATE PROCEDURE save_p1_proc()
 BEGIN
  DECLARE CONTINUE HANDLER FOR 1062
  BEGIN
	 ROLLBACK TO b;
  END;
	START TRANSACTION;
	 INSERT INTO account VALUES(NULL,'赵四',1000);
	 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;
	  ROLLBACK;
END;
START TRANSACTION;
INSERT INTO account VALUES(NULL,'赵四',1000);
SAVEPOINT b;
	INSERT INTO account VALUES(LAST_INSERT_ID(),'钱六',1000);
COMMIT;
END@@;

调用存储过程


DELIMITER ;
 CALL save_p2_proc();
 SELECT * FROM account;