diff --git "a/\351\231\210\346\231\223\344\270\234/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" "b/\351\231\210\346\231\223\344\270\234/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..f03bbc2b88942857ec3b8b3d0b8d60a8b425e4ab --- /dev/null +++ "b/\351\231\210\346\231\223\344\270\234/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" @@ -0,0 +1,117 @@ +## 一、笔记 + +事务: + +事务就是用户给数据库操作序列,要么全做,要么全不做,是一个整体,不可分割。 + +支持事务的数据库拥有4个特性: + +原子性,一致性,隔离性,持久性。 + +set @@autocommit=0;将系统中的自动提交关闭 + +start transaction;开启事务 + +rollback;回滚,撤销整个事务的所有操作,隐式的结束事务。 + +commit;提交,不能反悔 + +replease savepoint s1;删除s1这个保存点 + +回滚部分事务: + +start transction; + +select *from bank; + +INSERT INTO `bank` VALUES (1, '张三', 100); + +savepoint s1; + +INSERT INTO `bank` VALUES (2, '李四', 200); + +savepoint s2; + +INSERT INTO `bank` VALUES (3, '李五', 200); + +rollback to s2; + +commit; + +隔离四个级别:(isolation) + +1.读未提交(read uncommitted) + +a 没提交 ,b可以读a还没提交的东西 + +2.读已提交(read committed) + +3.可重复读(repeatable read) + +4.序列化读/串行化读(serializable) + +可解决所有问题,但是效率最低 + +```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,"陈晓东",666); +rollback; +SELECT *from bank; +2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; +start TRANSACTION; +SELECT *from bank; +update bank set money=5000 where username="李四"; +ROLLBACK; +SELECT *from bank; +3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; +start TRANSACTION; +SELECT *from bank; +UPDATE bank set money=5000 WHERE username="李四"; +commit; +SELECT *from bank; +4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; +start TRANSACTION; +SELECT *from bank; +UPDATE bank set money=666 WHERE username="张三"; +SAVEPOINT pys1; +insert into bank values(3,"陈晓东",888888); +SAVEPOINT pys2; +ROLLBACK to pys1; +SELECT *from bank; +5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 + 提醒.要考虑转出金额不足的情况 + create function transfer(zhuanruid int,zhuanchuid int,zhuanzhangmoney int) +RETURNs boolean +DETERMINISTIC +begin +declare money1 int; +declare result boolean DEFAULT FALSE; +SELECT money into money1 from bank WHERE id=zhuanchuid; +if money1>zhuanzhangmoney THEN +update bank set money=money1-zhuanzhangmoney WHERE id=zhuanchuid; +update bank set money=money1+zhuanzhangmoney WHERE id=zhuanruid; +set result=true; +end if; +return result; +end; +SELECT transfer(1,2,400); +SELECT *from bank; +``` + + +