MySQL 08 - SQL高级一

SQL高级一

1.视图

1.1 视图简介
  • 视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
1.1 定义视图
create view 视图名称 as select 语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 查看  超级本 的信息
SELECT g.*,c.`name` FROM goods g INNER JOIN goods_cates c ON g.`cate_name` = c.`id` HAVING c.`name` ='超级本';

# 将其变成视图 方便查看

CREATE VIEW v_cjb AS SELECT g.*,c.`name` AS cname FROM goods g INNER JOIN goods_cates c ON g.`cate_name` = c.`id` HAVING c.`name` ='超级本';
select * from v_cjb;

在这里插入图片描述

在这里插入图片描述

1.2 查看视图

查看表的时候会把视图表也列出来

show tables;
1.3 使用视图
select * from 视图名;
1.4 删除视图
drop view 视图名;
1.5 视图的作用
  • 简单:提高了重用性,就像一个函数。
  • 安全:提高了安全性能,可以针对不同的用户,设定不同的视图。
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
1.6 视图的修改

有下列内容之一,视图不能做修改

  • select子句中包含distinct
  • select字句中包含组函数
  • select语句中包含group by子句
  • select语句红包含order by子句
  • where子句中包含相关子查询
  • from字句中包含多个表
  • 如果视图中有计算列,则不能更新
  • 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作。

2. 事物

2.1 为什么要有事务

事务广泛的运用于订单系统、银行系统等多种场景

例如:
在这里插入图片描述
正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。

那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。

以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此

2.2 事物

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位

例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。现在要从用户Jane的支票账户转移200美元到她的储蓄账户,那么至少需要三个步骤:

1.检查支票账户的余额高于或者等于200美元。

2.从支票账户余额中减去200美元。

3.在储蓄帐户余额中增加200美元。

上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

2.3 事务四大特性(简称ACID)
  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)

隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)

持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

2.5 事务命令

表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎

  • 开启事务,命令如下
    开启事物后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;
或者
start transaction;
 begin  与 start transaction 的区别

 start transaction  reade only;
只读事物,也就是说添加reade only开启之后,只能查看,不能增删改。
  • 提交事物,命令如下
commit;
将缓存中的数据变更维护到物理表中
  • 回滚事物,命令如下
rollback;
放弃缓存中变更的数据  只能在内存中回滚 提交了就不行了
  • 保存点
    如果你开启了一个事务,并且已经敲了很多语句,忽然发现上一条语句有点问题,你只好使用ROLLBACK语句来让数据库状态恢复到事务执行之前的样子,然后一切从头再来,总有一种一夜回到解放前的感觉。所以设计数据库的大叔们提出了一个保存点(英文:savepoint)的概念,就是在事务对应的数据库语句中打几个点,我们在调用ROLLBACK语句时可以指定会滚到哪个点,而不是回到最初的原点。

    SAVEPOINT 保存点名称;
    

    当我们想回滚到某个保存点时,可以使用下边这个语句:

    ROLLBACK      TO     保存点名称;
    

    在这里插入图片描述
    在这里插入图片描述

    如果我们想删除某个保存点,可以使用这个语句:

    RELEASE SAVEPOINT 保存点名称;
    
3. 事务隔离级别

查看当前事物级别

SELECT @@tx_isolation;

在这里插入图片描述

设置mysql的隔离级别

基本语法

set session transaction isolation level 设置事务隔离级别

READ UNCOMMITTED(未提交读)

在READ UNCOMMITTED级别,事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别的隔离会导致很多问题,虽然在性能方面是最优的,但是缺乏其他级别的很多好处,所以这种隔离的级别很少在实际中应用。

READ UNCOMMITTED实践 开启两个MySQL SESSION,并将MySQL的默认隔离级别设置为READ UNCOMMITTED

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

在这里插入图片描述
在这里插入图片描述

READ COMMITTED(读已提交)

大多数数据库系统默认的隔离级别都是READ COMMITTED(但MySQL不是),"读已提交"简单的定义:一个事务只能看见已经提交的事务的修改结果。换句话说,一个事务从开启事务到提交事务之前,对其他事务都是不可见的,因此在同一个事务中的两次相同查询结果可能不一样。故这种隔离级别有时候也叫不可重复读(NONREPEATABLE READ)。

  • READ COMMITTED 实践
    在这里插入图片描述
    在这里插入图片描述

REPEATABLE READ(可重复读)

"可重复读"是MySQL的默认事务隔离级别。REPEATABLE READ解决了脏读的问题,该级别保证了在同一次事务中多次查询相同的语句结果是一致的。但是"可重复读"隔离级别无法避免产生幻行(Phantom Row)的问题,MySQL的InnoDB引擎通过多版本并发控制(MVCC,Multiversion Concurrency Controller)解决了幻读的问题。

  • REPEATABLE READ 产生幻行的实践

SERIALIZABLE(可串行化

SERIALIZABLE是最高的隔离级别,它通常通过强制事务串行,避免了前面说的幻读问题。简单来说,"可串行化"会在读取的每一行数据上都加锁,所以可能会导致大量的锁等待和超时问题,所以在实际的生产环境中也很少会用到这个隔离级别,只有在非常需要确保数据的一致性切可以接受没有并发的情况下,才会考虑使用这个隔离级别。

  • SERIALIZABLE实践
    在这里插入图片描述

在这里插入图片描述
从上面的过程我们可以看到,"可串行化"是通过对每一行数据都加锁的方式来避免幻行问题,这种方式效率非常的低,很容易造成较长时间的锁等待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值