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

一、什么视图?,view

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

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

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

1、创建视图,create

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

查看数据表

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

2、查看视图,show

格式1:show full tables;

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

3、查看视力创建信息

格式:show create view 视图名\G

 

4、使用视图

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

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

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

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

非常不好!

5、修改视图,alter

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

再查询视图

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

6、删除视图,drop

格式:drop view 视图名;

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

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进行事务处理

下面用例子说明

先创建一个表

再插入数据

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

开启事务处理的方式

1.开启事务处理

2.运行事务中的SQL

如果有失败的情况

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

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

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

 

总结:

使用事务处理功能

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

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

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

 

事务处理特点

具有隔离性

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

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

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

保证事务处理的正确性。

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

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

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

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

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

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

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

 

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

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

 

查看autocommit的全局变量

这个变量默认是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

 

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

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

 

MYSQL数据库日志文件的位置

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

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

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

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

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

我是小咖

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值