MySQL——事务管理(重点)、视图、用户管理

在我们刚开始学习数据库的时候就认识到了SQL的分类总共有三种DDL、DML、DCL,前面的学习已经用到了DDL、DML,今天的事务管理将用到DCL,数据控制语言,主要负责权限管理和事务。
一、事务的概念
       事务就是一组DML语句组成的,这些语句在逻辑上存在相关性,它们要么全部成功,要么全部失败。事务还规定不同的客户端看到的数据是不同的。
在这里插入图片描述
对于事务设置的整个使用过程,我们刚开始需要开启事务,等到开启事务以后,我们就开始我们的工作,等一个工作结束后(一个时间段过去)我们就设置这个时间段的保存点;然后继续做接下来的工作,每一个时间段都是这样,做完就设置保存点,这样的好处是如果在某个时间段发现有错误,那么只需要回滚到上一个保存点就可以了,不需要重新开始事务。
1.事务的基本操作
开始一个事务:start transaction;
创建一个保存点:savepoint 保存点的名字;
回到保存点:rollback to 保存点;
在这里插入图片描述
以上这个例子就是告诉我们,回到上一个保存点就是保存点以前的操作结果还在,但是保存点后的操作结果没有了。
2.事务操作的注意事项
(1)如果没有设置保存点也可以回滚,只是回滚到了事务开始的地方。直接使用rollback即可。
(2)如果一个事务已经被提交了那么就不可以再回滚了。
(3)InnoDB支持事务,MyISAM不支持事务。
注意:commit之后事务就结束了,事务结束之后再回滚就没有什么用了。
3.事务的隔离级别
MySQL数据库在同一时间很可能被很多的客户端使用,当这么多客户端在同时使用时它们的操作肯定时不一样的,每个人都希望只得到自己想要的效果,那么数据库提供了事务的隔离级别,这样就使得不同的客户端在进行操作的时候是相互独立的。保证数据的一致性。
4.无隔离性的问题
(1)脏读:一个事务在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,另外一个事务也访这个访问这个数据并且看到了这个修改后的数据就叫脏读。
(2)不可重复度:当一个事务需要多次访问数据,第一次访问的时候是一个数据,当正准备访问第二次数据的时候,又有另外一个事务来访问这个数据并且做了修改,这时第一个事务访问这个数据的第二次发现和第一次不一样了,这样的情况就叫不可重复读。
(3)幻读:当一个事务在访问数据的时候对这个数据的所有进行了修改,另外一个数据也访问这个数据并且修改了这个数据(插入一行新数据与原来的数据一样),这样第一个事务就可能会出现它修改以后的数据中还有没被修改的数据,这样就叫幻读。
注意:不可重复度的重点时修改——同样的条件,你两次读取的数据不相同;
           幻读的重点在于新增或删减——同样的条件两次读取的数据不一样了。
5.事务的隔离级别

在这里插入图片描述设置事务的隔离级别:select session transaction isolation read level uncommitted;
查看当前的隔离级别:select @@tx_isolation;
隔离级别例子:可串行化客户端A(select)————》DBMS——(锁)——》库
客户端B(update)————》等待队列
当A在执行select的时候 DBMS操作会对库加锁,那么B只能在等待队列,等到A的操作完成释放锁或等待超时才可以执行操作。
注意:mysql默认的级别是可重复读,一般情况不要修改。
6.事务的ACID特性
A(Atomicity):原子性——》一个事务不可分割
C(consistency):一致性——》事务始终与系统保持一致
I(isolation):独立性——》各个事务之间是相互独立的
D(Durability):持久性——》一个事务一旦提交将保持现有的性质
二、视图
1.视图的概念:视图是一个虚拟表,它的定义是基于查询一个完整的表,视图和真实的表一样包含一系列带有名称的列和行数据。
2.视图的创建:create view 视图名 as select 语句;
注意:
(1)在创建视图的时候视图名最后加上view_的前缀,这样更加易于区别普通表。
(2)对视图的数据进行修改也会影响到基表,对基表的数据进行修改也会影响到视图。因为视图的数据就来自于基表。
3.删除视图:drop view 视图名;(视图不会删除基表)
4.视图规则和限制
(1)视图名不可重复
(2)创建视图的数目无限,但是要考虑它的性能
(3)视图不能添加索引,视图不存储,索引需要存储
(4)视图可以提高安全性,但必须有访问权限
(5)当视图和select后面的表同时出现order by时,视图的将会被覆盖只有select后面的才起作用。
三、用户管理
对于一个数据库,可能有多个人需要使用它,但是如果每一个人都用这个数据库那么会出现许多问题,这个数据库拥有所有的权限,这些使用的人都拥有对这个数据库操作的所有权限。
在这里插入图片描述
通过用户管理,将root用户中一些权限抹去形成另外一个用户,这样的话风险性就会降低。
1.用户
(1)用户信息:MySQL中的用户都在系统数据库的mysql的user表中;
在这里插入图片描述
host:表示这个主机可以从哪个主机登陆,如果时localhost表示只能从本机登陆;
user:用户名
authentication_string:用户密码通过了passwo函数加密的;
—prive:用户拥有的权限
(2)创建用户
create user ‘用户名’@‘登陆主机或ip’ identified by ‘密码’;
(3)删除用户
drop user ‘用户名’@‘主机名’;
‘litao’@’%’===>直接给个用户名,不能删除,它默认是%,表示所有地方可以登陆的用户;
(4)修改用户密码
自己修改自己的密码:
set password = password(‘新的密码’);
root用户修改指定用户密码:
set password for ‘用户名’@‘主机名’=password(‘新的密码’);
2.用户的权限
(1)给用户授权
grant 权限列表 on 库.对象名 to ‘用户名’@‘登陆位置’ [identified by ‘密码’]
a.
. *:代表本系统中的所有数据库的所有对象
b.库. *:表示某个数据库中的所有数据对象
c.identified by表示可选。
(2)刷新权限
如果发现赋予权限后任然没有生效,那么就用下面的命令刷新权限
flush privileges;
(3)回收权限
revoke 权限列表 on 库.对象名 from ‘用户名’@‘登陆位置’;

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/83756096