神刀安全网

Mysql之你不得不知道的–事务transaction,数据库编程procedure ,视图…

事务

事务其实就是针对一组Sql语句,要么全部成功,要么全都失败,就比如银行转账,一个人转钱,一个人收钱,要么就是转钱成功,收钱也成功,要么就是转钱失败,收钱也失败,不会存在转钱成功,收钱失败的情况;

事务的使用:就是把一组sql语句放进事务里面,当sql语句都执行成功,执行提交。当有一条sql执行失败,执行回滚;

回滚:有两个用户X,Y;X给Y转账,X转钱成功,Y却没有收到钱,所以这种情况应该回滚到X转钱成功之前的数据;

首先开启事务:start transaction,,,然后执行Sql语句,出错,回滚rollback;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

提交:start transaction,,,执行sql语句,,,成功,,,commit提交;

这里需要注意一点,就是当我们开起事务之后,在执行回滚或者提交之前操作的数据都只是在内存里面发生的变化,磁盘上面的数据并没有变化,只有当执行了回滚或者提交磁盘数据才会发生改变;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

sql语句都执行成了,所以就commit;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

事务的特点:

1.原子性:要么都成功,要么全失败

2.一致性:让数据保持一致性,增多少,减多少,

3.隔离性:多个事务并发执行,每个事务是独立执行

4.持久性:一个事务执行成功,改变的应该是磁盘数据,而不是内存数据的变化;

注意点:事务默认是关闭的,还有一个自动提交的属性auto_commit默认是开启的,也就是说不开启事务的情况下,默认提交也是自动开启的,插入数据的时候就会直接插入磁盘,如果把默认提交关闭,那么每次插入数据都只是在内存操作,还需要commit才能插入磁盘;还有一点就是myisam引擎不支持事务,如果要用事务的话必须使用innodb引擎;

默认是开启了自动提交,所以我们没用事务的时候直接就插进了磁盘;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

当我们把自动提交关闭以后,就每次都需要commit了;

没有执行commit,没有插入磁盘

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

执行commit,提交到了磁盘;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

数据库编程

所谓数据库编程,就是把sql语句封装在函数里面,然后把函数存储到mysql,以后只需要传入参数,调用函数就可以了;用数据库编程效率比较高;

由于函数的语句的结束符是;,而sql语句的结束符也是;,所以为了避免冲突,首先把sql的结束符修改,用delimiter  符号,修改sql结束符;

语法: create procedure  函数名(参数)

            begin

            sql语句;

            end 结束符

call 函数名(参数)

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

查询数据库函数:

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

视图

视图其实就是一张临时表,里面存了你想让别人查出来的数据,有一些敏感数据如果你不想让别人查询,那他是查不出来的,比如说有家公司需要查询你的数据库,但是你不想把所有的信息都给他,那么你只需要给他提供一张视图表就可以了,你把他所需要的数据放进是视图表,那么他就只能查到视图表里面的数据

从下面就可以看出,我们其实是先执行了一些查询语句,然后把查询到的数据给了视图view,后面在查询视图,就只能查到视图这张临时表的数据了,查不到原表的数据;视图只能作用于查询,不能作用在其他语句上;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

触发器:

trigger,见名知意,触发器的意思就是当执行了某些操作后会触发某操作,

语法  触发器只能针对增删改,

create trigger 触发器名 after|befroe    insert|update|delete on 表名  fro each row

begin

sql 语句

end;

我们知道当统计表数据的时候一般是用count(*)函数,但是这个函数效率不高,所以我们就用触发器,往另一张统计表写入数据总量,到时候查询统计表就可以得到数据的总数,而不是用count()函数,这样效率会高很多

比如我们需要统计学生的总数:

当我们往学生表插入一条数据,就让统计表加一,删除一条数据,就让统计表减一,最后我们只需要查询统计表就可以得出数量总数,这样效率是最高的;

Mysql之你不得不知道的--事务transaction,数据库编程procedure ,视图...

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Mysql之你不得不知道的–事务transaction,数据库编程procedure ,视图…

分享到:更多 ()