From 994d7d7d6434ac06a51184ffe0c2c10f3ab62fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=8A=9F=E7=85=A7?= <3210416196@qq.com> Date: Thu, 17 Oct 2024 16:32:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20241017 \344\272\213\345\212\241.md" | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 "\345\217\266\345\212\237\347\205\247/20241017 \344\272\213\345\212\241.md" diff --git "a/\345\217\266\345\212\237\347\205\247/20241017 \344\272\213\345\212\241.md" "b/\345\217\266\345\212\237\347\205\247/20241017 \344\272\213\345\212\241.md" new file mode 100644 index 0000000..129989b --- /dev/null +++ "b/\345\217\266\345\212\237\347\205\247/20241017 \344\272\213\345\212\241.md" @@ -0,0 +1,124 @@ +# 笔记 + +- ### 创建事务 + + ```sql + create transaction; / begin -- 使用begin的时候可以不用;号 + ``` + +- ### 创建存储点 + + ```sql + savepoint 存储点名称; + ``` + +- ### 提交事务 + + ```sql + commit; + ``` + +- ### 回滚事务 + + ```sql + rollback; + ``` + +- ### 事务的特性(ACID) + + - ### 原子性(Atomicity) + + ### 原子性意味着事务中的所有操作要么全部完成,要么全部不完成,不会出现只执行了一部分的情况 + + - ### 一致性(Consistency) + + ### 一致性确保事务从一个一致的状态转换到另一个一致的状态。事务执行过程中不会破坏数据的完整性和业务规则 + + - ### 隔离性(Isolation) + + ### 隔离性保证了并发执行的事务之间的独立性。每个事务对其他事务的操作都是不可见的,直到事务完成 + + - ### 持久性(Durability) + + ### 持久性意味着一旦事务被提交,它对数据库的修改将是永久性的 + +## 源代码 + +```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, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; + +```sql +set @@autocommit=0; +begin +select * from bank; +insert into bank values(3,'肖鹏飞',2000); +rollback; +select * from bank; +``` + +#### 2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; + +```sql +start transaction; +select * from bank; +update bank set money=5000 where username='李四'; +rollback; +select * from bank; +``` + +#### 3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; + +```sql +start transaction; +select * from bank; +update bank set money=5000 where username='李四'; +commit; +select * from bank; +``` + +#### 4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; + +```sql +start transaction; +select * from bank; +update bank set money=666 where username='张三'; +savepoint s1; +insert into bank values (3,'ygz',88888888); +savepoint s2; +rollback to s1; +select * from bank; +``` + +#### 5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 + +```sql +create function transfer(out_id int,in_id int,p_money decimal(10,2)) returns varchar(20) deterministic +begin +declare temp_outmoney decimal(10,2); +declare temp_inmoney decimal(10,2); +select money into temp_outmoney from bank where id=out_id; +select money into temp_inmoney from bank where id=in_id; +if(p_money > temp_outmoney) then +return '转账失败'; +else +update bank set money=temp_inmoney+p_money where id=in_id; +update bank set money=temp_outmoney-p_money where id=out_id; +return '转账成功'; +end if; +end; +``` + +#### 提醒.要考虑转出金额不足的情况 \ No newline at end of file -- Gitee