视图--虚表,不在数据库中存放数据,数据源于基本表。
为什么要使用视图
- 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。
- 重复使用该sql语句。
- 使用表的组成部分而不是整个表。
- 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表。
- 更改数据格式和表示。
性能问题
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果是多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会出现性能下降。
使用视图跟使用基本表没有什么区别。用视图分两步:1.从基本表中查到数据2.打印出来。
创建视图:
create view 视图名 列名
as 子查询
with check option
使用show full tables可以查看表的类型,区分视图与基本表:
删除视图:
drop view 视图名;
事务
事务就是一个操作序列,(一个整体)不可分隔,执行一半出错-回滚。
使用场景:银行转账A->B转账不可分割。
事务的四大特性ACID:
原子性atomicity、一致性consistency、隔离性isolation、持久性durability
原子性:一个整体
一致性:状态转换相同
隔离性:两个事务同时执行,互不影响--是否可见
持久性:数据到数据库中,即使数据库坏了,数据也可以恢复。
隔离级别
隔离状态有四个级别,定义多个事务何时看到对方的修改。
1.未提交读READ UNCOMMITTED
隔离性最低。事务中的修改即使没有提交,对其他事务也都可见。脏读
2.提交读READ COMMITTED
大多数数据库的默认隔离级别。必须提交了事务,其他的事务才可见修改。
3.可重复读REPEATABLE READ
其他事务提交了该事务未结束时都还看不见修改。确保同一事物多次读到的数据是一致的,可能出现幻读问题。
4.可串行化SERIALIZABLE
很少使用,可能会导致锁征用和大量超时问题。事务不可同时有多个,事务必须串行的发生。
查询当前会话的隔离级别:
SELECT @@SESSION.transaction_isolation;
默认查出来mysql是可重复读。
查询系统的隔离级别
SELECT @@GLOBAL.transaction_isolation;
幻读(可重复读中):
一个事务在读取某个范围内的记录时,另一个事务在该范围修改了记录,但是前一个事务看不到修改的。
另一个事务插入语句会产生幻行。
设置隔离级别:
设置全局隔离级别:
set global transactin isolation level 级别;
设置会话隔离级别:
set session transaction isolation level 隔离级别;
事务的操作
开启事务:bedin; 或 strat transaction;
提交事务:commit;
回滚事务:rollback;相当于撤回
因为事务是一个操作序列,开始事务后的操作可以rollback放弃,结束后相当于没有执行语句。
单独执行一条语句,不用begin和commit包围,系统自动将这个语句当一个事务。