编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

一、什么视图?,view

视图就是一个SELECT查询的结果,可以认为是一张虚拟的数据表。

所以视图是通过查询语句产生的。

视图是为了隐藏真实的数据表。

1、创建视图,create

格式:create view 视图名称 as  SELECT语句

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

查看数据表

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

会发现有一个名字和刚才创建的视图名称相同

2、查看视图,show

格式1:show full tables;

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

格式2:通过information_schema.views表来查看

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

3、查看视力创建信息

格式:show create view 视图名\G

 

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

4、使用视图

直接象使用数据表一样进行查询。

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

除了对视图进行查询,是否可以对视图进行修改、删除、插入?

答案是可以!但是不建议这么做。

原因:视图本身就是产生的一个中间查询结果。就是为了隐藏真实的数据表。视图主要是拿来用的。不应该去试图修改、删除。

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

非常不好!

5、修改视图,alter

格式:alter view 视图名 as SELECT语句

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

再查询视图

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

可见视图的修改相当于重新定义查询语句

6、删除视图,drop

格式:drop view 视图名;

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

删除视图不会对原有的数据表产生影响,只是视图没有了。

7、视图扩展知识

视图是有类型区分的。

创建视图时可以指定它的类型:

ALGORITHM(算法)可取三个值:

MERGE:合并方式,视图本身就是个SELECT语句,就是把使用视图的语句和视图的语句合到一起再执行

TEMPTABLE:临时表方式,会把视图的语句执行结果生成一个临时表再来用

UNDEFINED:未定义,由MYSQL服务器来决定用哪种方式

 

二、Mysql的全事务处理

安全事务处理是把一组SQL当成一个整体,当成一个事务。要么全部执行成功,要么全部不生效。

如果实现安全事务处理?

  1. 要求数据表必须是innodb类型的存储引擎
  2. 只需要使用3句SQL就可以实现此功能

 

是哪3句SQL?

  1. Start transaction

开启安全事务处理

运行此句后,就进入了安全事务处理状态,之后的SQL是作为一个整体来看待的

  1. commit

提交事务处理结果

当事务中的所有SQL全部正确的执行成功后,使用commit把结果进行提交并结束事务处理

  1. rollback

当事务中的SQL有执行失败情况时,撤消事务中的所有SQL的执行结果,并结束事务处理

1、使用transaction进行事务处理

下面用例子说明

先创建一个表

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

再插入数据

在未开启事务处理时,如果SQL执行中出现问题,将只能手工处理,问题很大

开启事务处理的方式

1.开启事务处理

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

2.运行事务中的SQL

如果有失败的情况

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

注意:失败要由程序员自己来判断

3.失败则需要使用rollback进行事务回滚,撤消之前的所有操作,结束事务处理

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

  1. 如果事务的SQL全部执行成功,则使用commit提交事务结果,结束事务

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

 

总结:

使用事务处理功能

  1. 要使用start transaction开启事务
  2. 执行事务中的每一句SQL时都要判断
  3. 如果事务中的SQL有失败的情况,使用rollback回滚并结束事务

判断方法:if( !($res = mysql_query()))或if( !mysql_query() ),判断执行是否返回false

  1. 如果事务中的SQL全部执行成功,使用commit提交并结束事务

 

事务处理特点

具有隔离性

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

不同的用户看到的是不同的数据(一个是在进行事务处理,一个是正常查询)

如果没有开启事务处理,一个用户的操作中数据变化,另一个用户不能够立刻看到

事务处理中使用了的记录会被行锁定,以免影响操作的结果

保证事务处理的正确性。

2、使用全局变量autocommit进行事务处理

MYSQL的事务处理实际是把SQL的运行分成了:执行+提交 两个部分

正常情况下,SQL执行后会有一个结果,结果被写入到数据表后,才形成事实。

事务处理状态下,SQL只执行,结果并没有写入到真实的数据表。

只有事务中的所有SQL都执行成功,使用commit,才会把结果写入数据表。

提交状态中,结果是保存在日志文件中的。

提交后,才把数据从日志文件变成数据表的内容。

 

事务处理下,SQL是执行不提交的。Commit后才提交。

正常情况下,SQL是执行并同时提交的。

 

查看autocommit的全局变量

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

这个变量默认是on,说mysql在没有开启事务时,所有的SQL都是自动提交的,就是执行并提交的。

如果我们把这个变量的值进行改变,如set autocommit=0,就会让此客户端之后的所有SQL变成只执行不提交的状态!

 

最后怎么去提交?

  1. set autocommit=1,恢复默认的状态,相当于结束了事务处理,并提交SQL执行结果
  2. 使用commit或rollback将有面的SQL回滚或提交。但切记,现在还是处于事务状态!!!

就是说,等于是结束了一个事务,又开始了一个新事务。

使用start transaction也是一样的,相当于结束了一个事务,又开启了一个事务。

真正想使用autocommit来手工模拟事务处理,一定是结束时要set autocommit=1设回去。

 

使用autocommit手工进行事务处理

  1. set autocommit=0
  2. 执行事务中SQL

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

 

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

将autocommit设置回1,事务将提交并结束

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

结论:两种方法都可以实现事务处理功能。推荐使用start transaction方式。

 

MYSQL数据库日志文件的位置

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解

3、安全事务处理的ACID特点

原子性(A):事务中的SQL看成一个整体,不可分割。

一致性(C):事务中的SQL要么全部执行成功,要么全部无效

隔离性(Isolation):事务间是隔离的,互相不能干扰,互相看不见

持久性(D):事务处理的结果必须能够写入到数据表中

我是小咖

发个邀请:
如果你正好想学习php,可以与我一起交流,我的VX:feilueze333。下面资料免费赠送。

编程之路之数据库mysql(七)- mysql视图(view)和事务(transaction)详解