一、 事务
事务是需要在同一个处理单元中执行的一系列更新处理的集合,对于银行转账这种需要在同一个处理单元中执行的一系列更新操作的情况,一定要使用事务
1、创建事务
(1) SQL Server、PostgreSQL
begain transaction
(2) MySQL
start transaction
(3) Oracle、DB2
无
2、commit是提交事务包含的全部更新处理的结束指令,相当于文件处理中的覆盖保存,一旦提交,就无法恢复到事务开始前的状态了
3、ROLLBACK是取消事务包含的全部更新处理的结束指令,相当于文件处理中的放弃保存,一旦回滚,数据库就恢复到事务开始前的状态
4、几乎所有的dbms都无需开始指令,大部分情况下,事务在数据库连接建立时就已经悄悄开始了,并不需要用户再明确发出开始指令,比如使用oracle时数据库建立连接之后,第一条sql语句执行的同时事务就已经悄悄开始了
像这种不使用指令而悄悄开始事务的情况下,应该如何区分各个事务呢,通常会有如下2种情况:
(1) 每条sql语句就是一个事务(自动提交模式)
(2) 直到用户执行commit或者rollback为止算一个事务
通常的dmbs都可以选择其中任意一种模式,默认使用自动提交的有sql server、postgresql、mysql,在该模式下的dml语句都括在事务的开始语句和结束语句之中,而使用第2种模式的oracle事务都是直到用户自己执行提交或都回滚指令才会结束
5、事务的ACID特性:
(1) 原子性,是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有
(2) 一致性,事务中包含的处理要满足数据库提前设置的结束,如主键约束、或者not null约束等
(3) 隔离性,保证不同事务之间互不干扰
(4) 持久性,事务(不论是提交还是回滚)结束后,dbms能够保证该时间点的数据状态会被保存
二、视图
表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的select语句
1、视图的优点
(1) 视图无需保存数据,因此可以节省存储设备的容量
(2) 可以将频繁使用的select语句存成视图,这样就不用每次都书写了,特别是在进行汇总以及复杂的查询条件导致select语句非常庞大时,使用视图可以大大提升效率,而且视图中的数据会随着原表的变化自动更新,视图归根到底就是select语句,所谓"参照视图"就是"执行select语句"的意思
2、避免在视图的基础上创建视图,多重视图会降低sql的性能
3、在定义视图时可以使用任何select语句,但是不可以使用order by,因为视图和表一样,数据行都是无顺序的
4、如果定义视图的select语句能够满足某些条件,那这个视图可以被更新:
(1) select子句中未使用distinct
(2) from子句中只有一张表
(3) 未使用group by子句
(4) 未使用having子句
5、通过汇总得到的视图无法进行更新,不是汇总得到的可以更新,如果视图数据发生了变化,表数据也要相应变化
6、如果删除以视图为基础创建出来的多重视图,由于存在关联视图,需要加cascade