Oracle数据之事务
视图与索引与序列
视图
致命三连
-
是什么:建立在结果集与表之间的虚拟表
-
为什么:可以简化sql语句,对常用的sql语句进行封装
-
怎么用:create or replace view 视图名 as select语句 [with read only];
select * from 视图名;
分类
-
物理视图 : 真是存储数据
-
逻辑视图 : 不会真是存储数据,数据来资源数据源 注意:更改视图中数据就是更改数据源数据。
权限问题
要想创建视图首先得获取创建视图权限
-
登录sys管理员账号
-
授权: grant dba to 账户名;
-
回收: revoke dba from 账户名;
索引
致命三连
-
是什么:相当于目录
-
为什么:提高查询效率
-
怎么用:添加索引:create index index_sal on emp(sal)
注意:
-
索引是透明的,一个字段上是否添加了索引对字段的使用没有任何影响
-
大数据量前提下,做查询才会提高效率,如果频繁做增删,反而会降低效率,索引也是数据库的对象之一,需要维护
-
唯一性较好,少量修改,大量查询适合添加索引
-
oracle数据库自动为主键添加索引
序列
-
是什么:是使用工具|程序管理流水号
-
注意:
-
序列是管理主键字段值的,是数值型的,并有一定变化规律
-
序列没有事务管理,所以没有回滚,多个事务无法获取同一个值
-
序列的创建不与字段绑定,所以删除的时候不影响之前的使用
-
第一次使用序列要先获取下一个最新值
-
-
怎么用:
-
创建序列
create sequence 序列名 start with 起始值 increment by 步进;
-
获取下一个序列值
select seq_deptno.nextval from dual;
-
获取当前序列值
select seq_deptno.currval from dual;
-
插入序列号
insert into dept values(seq_deptno.nextval,'','');
-
删除序列
drop sequence seq_deptno;
-
事务
致命三连
-
是什么:是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。
-
为什么:为了保证数据的安全有效
-
怎么样:事务的开启与结束
事务的开启
执行DML中的insert delete update默认开启事务
事务的结束
-
成功
-
手动提交:使用commit
-
正常执行完成DDL语句:create,alter,drop
-
正常执行DCL语句:GRANT,REVOKE
-
正常退出,询问是否提交
-
如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
-
-
失败
-
意外退出,强制断电
-
手动提交:使用rollback
-
四个特性
-
原子性:是数据库中逻辑工作单位,事务中各种操作,要么全完成要么都不完成
-
一致性:只有一种结果,不是全写入,就是全不写入
-
隔离性:一个事务操作其他事务无法干扰,并发事务互不干扰,是隔离的
-
持续性:一旦提交永久性改变
脏读,幻读与不可重复读
-
脏读:无效数据读出(脏数据)一个事务读取了另一个事务未提交的数据 解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)
-
幻读:幻读也是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。 解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证
-
不可重复读:是指在同一个事务内,两次相同的查询返回了不同的结果 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读)
注意:不可重复读出现多是因为修改,幻读重点在于新增与删除。可添加锁的概念解决此类问题,但会影响性能。
事务四个隔离级别
-
Read uncommitted:读未提交,就是一个事务可以读取另一个未提交事务的数据
-
Read committed:读提交,就是一个事务要等另一个事务提交后才能读取数据
-
Repeatable read:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
-
Serializable 序列化:是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。