mysql
事务
用途:
a -> b 转账
1. a的账户的钱 先扣去掉一部分 update person set money = money - 10 where name = a;
2. b的账户的钱 增加a扣除的部分 update person set money = money + 10 where name = b;
上面两个条sql语句 要求全成功, 要么都失败, 这个时候我们就可以把这两个sql语句放到同一事务中
支持情况: 只有Innodb 引擎的才支持, 常见的引擎有两个(Innodb, MyISAM)
事务的特征(ACID):
原子性,每个事务是一个最小的不可分割单元
一致性,数据执行执行完事务之后,数据要保持一致(正确)
隔离性,事务和事务之间是隔离的,相互不影响(4中隔离级别)
持久性,一旦事务提交成功,数据发生了不可逆的变化
事务执行的语句:
select 不需要事务的
插入,更新,删除 默认情况下一条sql就是一个事务,事务默认是开启自动提交的
sql语句的执行 (SET AUTOCOMMIT=0), 把自动提交给取消
开始事务 begin
执行sql (如果中间错误了,执行rollback)
提交事务 commit
存档(savepoint)
mysql的隔离级别
查看mysql 默认的隔离级别
@@global.transaction_isolation 系统的隔离级别
@@transaction_isolation 当前会话的隔离级别
select @@global.transaction_isolation,@@transaction_isolation;
隔离级别
read uncommitted (读未提交) --> 导致脏读,读取到其他事务没有提交的数据,如果其他万一回滚,这是数据无效。
REPEATABLE-READ(默认的隔离级别,读已提交) -> 解决脏读,导致不可重复读取,在同一事务中前后两次查询的数量可能不一致。
repeatable-read (可重复读) -> 解决不可重复读,导致幻读
1. 在A中开启事务 1. 在B中开启事务
2. 查询一下叫'李四'学生 2. 插入‘李四’的学生
3. 提交事务
3. 查询‘李四’,李四不存在
4 插入一下李四,有插入不成功(name要唯一)
serializable(串行化)
解决幻读
1. 一个事务一个的执行,事务都不并发,没有任何问题,但是会到性能下降
隔离界别越高,性能越下降(采用默认的隔离级别就可以了)
修改隔离级别
set session transaction isolation level read uncommitted
set session transaction isolation level read committed
set session transaction isolation level repeatable read
视图
View
应用场景
1. 数据关联很复杂
2. 有一些数据不能想某些人看 (让别人通过视图查询数据)
什么是视图
一张虚拟表,有字段等,但是不真正的存储数据,对查询结果的一个引用,在使用视图的时候,我们以查询为主,基本不上不做更新,添加,删除操作。
- 查询 张三的人,他的各门课程成绩, 按照降序进行排序
select st.s_name sname, cu.c_name cname, sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id where st.s_name = '钱电' order by score desc;
可以使用视图
1. create view temp as select st.s_id sid,st.s_name sname, cu.c_name cname, sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id
2. select * from temp where sname = '赵雷' order by score desc;
注意: 如果希望更新视图,视图和数据表的关系一一对应的,如果希望做更新和插入,直接在原表上进行
视图不属于这一次会话, 一次创建之后可以一直使用
视图是对真实数据表的引用,当真实数据表发生变化的时候,视图的数据也跟着发生变化。