mysql总结(2020-07-16)

# 事务

用途:

   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中开启事务     2. 在B中开启事务

    3. 查询一下叫'李四'学生  4. 插入‘李四’的学生

                  5. 提交事务

    6. 查询‘李四’,李四不存在

    7 插入一下李四,有插入不成功(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. 有一些数据不能想某些人看 (让别人通过视图查询数据)

  什么是视图

    一张虚拟表,有字段等,但是不真正的存储数据,对查询结果的一个引用,在使用视图的时候,我们以查询为主,基本不上不做更新,添加,删除操作。

  1. 查询 张三的人,他的各门课程成绩, 按照降序进行排序

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;

  # 注意: 如果希望更新视图,视图和数据表的关系一一对应的,如果希望做更新和插入,直接在原表上进行

  # 视图不属于这一次会话, 一次创建之后可以一直使用

  # 视图是对真实数据表的引用,当真实数据表发生变化的时候,视图的数据也跟着发生变化。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。