Part 2 —— 事务、流程控制
今日内容概要
1、视图(了解)2、触发器trigger3、'事务'4、存储过程procedure5、函数6、'流程控制'7、函数8、流程控制9、索引与慢查询优化10、索引分类1.自行百度搜索并提炼"数据库设计三大范式" 分别是哪三大以及各自有何特征2.整理今日内容及博客3.自行复习python基础
一、事务

# 四大特性(ACID) A:原子性(atomicity) 每个事务都是不可分割的最小单位(同一个事务内的多个操作要么同时成功要么同时失败) C:一致性(consistemcy) 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的 I:隔离性(isolation) 事务与事务之间彼此不干扰 D:持久性(durablity) 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
1、MySQL开启事务的三种方式
1、隐式开启,隐式提交 "mysql默认" '默认情况下,你每敲一条SQL语句,都会开启一个事务。' 每条sql语句一运行完,会自动帮你commit提交,所以平时我们使用update语句修改数据库,都会自动提交。2、显式开启,显示提交"掌握" 格式: start transaction; # 或begin; sql语句1; sql语句2; [commint/rollback] # 如何开启事务 start transaction; 或 begin; # 如何回滚 rollback; # 如何确认 commit;3、显示开启,隐式提交'(用的少)' Set session autocommit =0 这样设置完,就不会自动提交总结:MYSQL 默认为每条sql开启事务,并且会在本条sql执行完毕后自动执行commit提交 若想设置手动提交,有两种方式: 方式一:直接用 SET 来改变 MySQL 的自动提交模式(下述设置均为会话级别的设置): SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开0启自动提交 方式二: 手动开启的事务里默认不会自动提交 # 手动开启的事务里默认不会自动提交,所以我们可以将要执行的sql语句放在我们自己手动开启的事务里 start transaction; update test.t1 set id=33 where name = "jack"; commit; 注意:这种方式在当你使用commit或者rollback后,事务就结束了,再次进入事务状态需要再次start transaction
2、案例
----------------------------------'建案例表'-----------------------------------create table user( id int primary key auto_increment, name char(32), money int)insert into user(name,money)values("yly",1000),("zpx",1000),("aaa",1000);----------------------------------'事务操作'-----------------------------------start transaction;# sql语句update user set money=900 where name="yly"; # yly买支付100元update user set money=1010 where name="zpx"; # 中介zpx拿走10元update user set money=1090 where name="aaa"; # 卖家aaa拿到90元#回滚rollback; # 上面三个操作,回到开启事务之前的状态或commit; # 确认提交数据注意:使用了rollback或者commit,这个事务就结束了如果要重新操作,那么需要重新开启事务
二、流程控制(开发了解,DBA掌握)
注意: 流程控制是卸载存储过程内delimiter //create procedure proc_if()begin declare i int default 0; # if判断 if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SELECT 2; ELSE SELECT 7; END IF;END //delimiter ;call proc_if();# while循环delimiter //create procedure proc_while()begin declare num int; set num = 0; while num < 10 do select num; set num = num + 1; end while;end //delimiter ;c