diff --git "a/\345\273\226\346\263\260\347\216\256/20241017 \344\275\234\344\270\232.md" "b/\345\273\226\346\263\260\347\216\256/20241017 \344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..ce8b1aa67e0ef9c253155ac8e16ce2d1740d8666 --- /dev/null +++ "b/\345\273\226\346\263\260\347\216\256/20241017 \344\275\234\344\270\232.md" @@ -0,0 +1,76 @@ +```sql +## 要操作的表结构与数据 +create table bank( + id int primary key auto_increment , + username varchar(10), + money int +); + +INSERT INTO `bank` VALUES (1, '张三', 100); +INSERT INTO `bank` VALUES (2, '李四', 200); + + + +## 练习题: +1, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; + +set @@autocommit =0; +SELECT * FROM bank; +INSERT into bank VALUES(3,'关松涛',1); +SELECT * FROM bank; +ROLLBACK; +SELECT * FROM bank; + +2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; + +START TRANSACTION; +SELECT * FROM bank; +UPDATE bank set money =5000 WHERE id =2; +SELECT * FROM bank; +ROLLBACK; +SELECT * FROM bank; + +3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; + + +START TRANSACTION; +SELECT * FROM bank; +UPDATE bank set money =5000 WHERE id =2; +COMMIT; +SELECT * FROM bank; + +4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; + +START TRANSACTION; +SELECT * FROM bank; +UPDATE bank set money =666 WHERE id =1; +SAVEPOINT s1; +INSERT into bank VALUES(3,'关松涛',888888); +SAVEPOINT s2; +SELECT * FROM bank; +ROLLBACK to s1; +SELECT * FROM bank; + +5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 + 提醒.要考虑转出金额不足的情况 + + DROP PROCEDURE if exists transfer; +CREATE PROCEDURE transfer(IN rollout_id INT ,IN rollin_id INT,IN roll_money int) + BEGIN + DECLARE pd VARCHAR(20) DEFAULT '转账失败,余额不足'; + DECLARE ye int; + SELECT money into ye FROM bank WHERE id=rollout_id; + START TRANSACTION; + IF ye>roll_money THEN + UPDATE bank SET money =money-roll_money WHERE id=rollout_id; + UPDATE bank SET money =money+roll_money WHERE id=rollin_id; + COMMIT; + SET pd ='转账成功'; +ELSE + ROLLBACK; +END IF; +SELECT pd as '状态'; + END; + + call transfer(2,1,9999); +``` \ No newline at end of file