编程之路之数据库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当成一个整体,当成一个事务。要么全部执行成功,要么全部不生效。
如果实现安全事务处理?
- 要求数据表必须是innodb类型的存储引擎
- 只需要使用3句SQL就可以实现此功能
是哪3句SQL?
- Start transaction
开启安全事务处理
运行此句后,就进入了安全事务处理状态,之后的SQL是作为一个整体来看待的
- commit
提交事务处理结果
当事务中的所有SQL全部正确的执行成功后,使用commit把结果进行提交并结束事务处理
- rollback
当事务中的SQL有执行失败情况时,撤消事务中的所有SQL的执行结果,并结束事务处理
1、使用transaction进行事务处理
下面用例子说明
先创建一个表
再插入数据
在未开启事务处理时,如果SQL执行中出现问题,将只能手工处理,问题很大
开启事务处理的方式
1.开启事务处理
2.运行事务中的SQL
如果有失败的情况
注意:失败要由程序员自己来判断
3.失败则需要使用rollback进行事务回滚,撤消之前的所有操作,结束事务处理
- 如果事务的SQL全部执行成功,则使用commit提交事务结果,结束事务
总结:
使用事务处理功能
- 要使用start transaction开启事务
- 执行事务中的每一句SQL时都要判断
- 如果事务中的SQL有失败的情况,使用rollback回滚并结束事务
判断方法:if( !($res = mysql_query()))或if( !mysql_query() ),判断执行是否返回false
- 如果事务中的SQL全部执行成功,使用commit提交并结束事务
事务处理特点
具有隔离性
不同的用户看到的是不同的数据(一个是在进行事务处理,一个是正常查询)
如果没有开启事务处理,一个用户的操作中数据变化,另一个用户不能够立刻看到
事务处理中使用了的记录会被行锁定,以免影响操作的结果
保证事务处理的正确性。
2、使用全局变量autocommit进行事务处理
MYSQL的事务处理实际是把SQL的运行分成了:执行+提交 两个部分
正常情况下,SQL执行后会有一个结果,结果被写入到数据表后,才形成事实。
事务处理状态下,SQL只执行,结果并没有写入到真实的数据表。
只有事务中的所有SQL都执行成功,使用commit,才会把结果写入数据表。
提交状态中,结果是保存在日志文件中的。
提交后,才把数据从日志文件变成数据表的内容。
事务处理下,SQL是执行不提交的。Commit后才提交。
正常情况下,SQL是执行并同时提交的。
查看autocommit的全局变量
这个变量默认是on,说mysql在没有开启事务时,所有的SQL都是自动提交的,就是执行并提交的。
如果我们把这个变量的值进行改变,如set autocommit=0,就会让此客户端之后的所有SQL变成只执行不提交的状态!
最后怎么去提交?
- set autocommit=1,恢复默认的状态,相当于结束了事务处理,并提交SQL执行结果
- 使用commit或rollback将有面的SQL回滚或提交。但切记,现在还是处于事务状态!!!
就是说,等于是结束了一个事务,又开始了一个新事务。
使用start transaction也是一样的,相当于结束了一个事务,又开启了一个事务。
真正想使用autocommit来手工模拟事务处理,一定是结束时要set autocommit=1设回去。
使用autocommit手工进行事务处理
- set autocommit=0
- 执行事务中SQL
将autocommit设置回1,事务将提交并结束
结论:两种方法都可以实现事务处理功能。推荐使用start transaction方式。
MYSQL数据库日志文件的位置
3、安全事务处理的ACID特点
原子性(A):事务中的SQL看成一个整体,不可分割。
一致性(C):事务中的SQL要么全部执行成功,要么全部无效
隔离性(Isolation):事务间是隔离的,互相不能干扰,互相看不见
持久性(D):事务处理的结果必须能够写入到数据表中
我是小咖
发个邀请:
如果你正好想学习php,可以与我一起交流,我的VX:feilueze333。下面资料免费赠送。