事务其实就是针对一组 Sql 语句, 要么全部成功, 要么全都失败, 就比如银行转账, 一个人转钱, 一个人收钱, 要么就是转钱成功, 收钱也成功, 要么就是转钱失败, 收钱也失败, 不会存在转钱成功, 收钱失败的情况;
事务的使用: 就是把一组 sql 语句放进事务里面, 当 sql 语句都执行成功, 执行提交. 当有一条 sql 执行失败, 执行回滚;
回滚: 有两个用户 X,Y;X 给 Y 转账, X 转钱成功, Y 却没有收到钱, 所以这种情况应该回滚到 X 转钱成功之前的数据;
首先开启事务: start transaction,,, 然后执行 Sql 语句, 出错, 回滚 rollback;
提交: start transaction,,, 执行 sql 语句,,, 成功,,,commit 提交;
这里需要注意一点, 就是当我们开起事务之后, 在执行回滚或者提交之前操作的数据都只是在内存里面发生的变化, 磁盘上面的数据并没有变化, 只有当执行了回滚或者提交磁盘数据才会发生改变;
sql 语句都执行成了, 所以就 commit;
事务的特点:
1. 原子性: 要么都成功, 要么全失败
2. 一致性: 让数据保持一致性, 增多少, 减多少,
3. 隔离性: 多个事务并发执行, 每个事务是独立执行
4. 持久性: 一个事务执行成功, 改变的应该是磁盘数据, 而不是内存数据的变化;
注意点: 事务默认是关闭的, 还有一个自动提交的属性 auto_commit 默认是开启的, 也就是说不开启事务的情况下, 默认提交也是自动开启的, 插入数据的时候就会直接插入磁盘, 如果把默认提交关闭, 那么每次插入数据都只是在内存操作, 还需要 commit 才能插入磁盘; 还有一点就是 myisam 引擎不支持事务, 如果要用事务的话必须使用 innodb 引擎;
默认是开启了自动提交, 所以我们没用事务的时候直接就插进了磁盘;
当我们把自动提交关闭以后, 就每次都需要 commit 了;
没有执行 commit, 没有插入磁盘
执行 commit, 提交到了磁盘;
数据库编程
所谓数据库编程, 就是把 sql 语句封装在函数里面, 然后把函数存储到 mysql, 以后只需要传入参数, 调用函数就可以了; 用数据库编程效率比较高;
由于函数的语句的结束符是;, 而 sql 语句的结束符也是;, 所以为了避免冲突, 首先把 sql 的结束符修改, 用 delimiter 符号, 修改 sql 结束符;
语法: create procedure 函数名 (参数)
begin
sql 语句;
end 结束符
call 函数名 (参数)
查询数据库函数:
视图
视图其实就是一张临时表, 里面存了你想让别人查出来的数据, 有一些敏感数据如果你不想让别人查询, 那他是查不出来的, 比如说有家公司需要查询你的数据库, 但是你不想把所有的信息都给他, 那么你只需要给他提供一张视图表就可以了, 你把他所需要的数据放进是视图表, 那么他就只能查到视图表里面的数据
从下面就可以看出, 我们其实是先执行了一些查询语句, 然后把查询到的数据给了视图 view, 后面在查询视图, 就只能查到视图这张临时表的数据了, 查不到原表的数据; 视图只能作用于查询, 不能作用在其他语句上;
触发器:
trigger, 见名知意, 触发器的意思就是当执行了某些操作后会触发某操作,
语法 触发器只能针对增删改,
create trigger 触发器名 after|befroe insert|update|delete on 表名 fro each row
begin
sql 语句
end;
我们知道当统计表数据的时候一般是用 count(*) 函数, 但是这个函数效率不高, 所以我们就用触发器, 往另一张统计表写入数据总量, 到时候查询统计表就可以得到数据的总数, 而不是用 count() 函数, 这样效率会高很多
比如我们需要统计学生的总数:
当我们往学生表插入一条数据, 就让统计表加一, 删除一条数据, 就让统计表减一, 最后我们只需要查询统计表就可以得出数量总数, 这样效率是最高的;
来源: http://www.jianshu.com/p/407030e2dd85