1、事务
事务是一组DML操作的逻辑单元,用来保证数据一致性的。在一个事务内,组成事务的DML操作,要么一起成功提交,要么一起撤销。
事务控制语言 TCL:
commit:事务提交,将全部数据的修改进行确认提交
rollback:事务回滚,回退到事务开始,数据的状态和事务开始之前一致
savepoint:事务保存点
事务的开始和终止:
开始:事务开始于上一个事务的终止或第一条DML操作(insert/update/delete)
终止:事务终止于显示操作(commit/rollback)
事务中数据的状态:如果多个会话操作同一个表数据,当用户和服务器连接成功后,服务端oracle将与客户端建立一个会话(session),客户端与oracle服务器的交互都是在此会话中进行
事务演示:
步骤1:打开一个会话A,创建表并插入一条数据,不提交(commit)
create table mytemp( id number(4) ); insert into mytemp values(1); select * from mytemp;//查看数据
步骤2:打开会话B时,在会话A commit提交之前,会话B查看不到数据
步骤3:会话A提交后,会话B可以查看数据
步骤4:会话A进行update操作,不提交,会话B仍然看不到数据
修改:update mytemp set id=1001;
步骤5:会话A提交,会话B可以看到数据的修改
步骤6:会话A进行更新操作不提交,会话B进行删除操作时被挂起,因为视图操作的是相同的数据
步骤7:会话A进行提交之后,会话B结束阻塞状态开始执行
步骤8:会话A进行更新操作,再回滚操作
update mytemp set id=5678; rollback;
总结:
a. 事务的内部数据的改变只是在自己的会话中可见(未提交)
b. 事务会对操作的数据加锁,不允许其他事务操作
c. 如果提交操作,数据的改变确认所有的会话都能看到数据的修改;数据上的锁被释放;保存数据的临时空间被释放
d. 如果回滚操作,数据的改变被取消;数据上的锁被释放;临时空间被释放
savepoint:设置保存点,可以回滚到指定的保存点
保存点演示: create table temp( id number(4) ); //事务的开始 insert into temp values(3); savepoint A; insert into temp values(4); savepoint B; insert into temp values(5); //回滚到保存点A时,A之后的保存点全部被取消 rollback to A; select * from temp;//只有一条数据 3
2、数据库的主要对象
1)表(table)
表是数据库存储的基本单元,在关系型数据库中,表是一个二维结构,由行和列组成。横向为行也叫记录,纵向为列也叫字段
2)视图(view)
视图是一个虚表,视图对应于一条select语句,此语句得到的结果集被赋予一个名字,即视图的名字。可以像操作表一样操作视图
视图的使用和表相同,视图的好处,简化查询,隐藏数据表的列,视图不包含任何数据,视图是基本数据的投影
//查询20部门员工信息 select empno,ename,position from emp_xu where deptno=20; //创建视图 create view view_emp as select empno,ename,position from emp_xu where deptno=20; //权限不足 sqlplus /as sysdba //分配权限 grant create view to scott; //回收权限 revoke create view from scott; //scott登录 conn scott; //查看视图 select * from view_emp; //修改基表(emp_xu)数据 update emp_xu set ename='郭靖1' where empno=1004; //修改视图(view_emp)数据 update view_emp set ename='郭靖' where empno=1004;
总结:基表的DML操作会改变视图的显示结果,对视图的DML操作同样会改变基表的数据。视图只是基表的投影
3、索引(index)
索引是用来在数据库中加速查询的数据库对象。通过快速访问路径方式来快速定位数据,可以较少的磁盘I/O操作,提高访问性能。
全盘扫描方式:查询效率低
索引查询:比全盘扫描快
//空间来换时间,使用索引占用空间,提高查询效率
索引结构:数据+地址
自动创建索引:如果数据表有PK、Uk,这两个约束,索引是自动创建的,除此之外,需要手动创建
手动创建索引:
create index 索引名 on 表名(列名); //给员工表empno添加一个索引 create index index_empno on emp_xu(empno); //根据员工号找员工 select ename from emp_xu where empno=1004; //查看语句执行时间 set timing on;
说明:添加索引之后查询,由于数据量比较小,前后效果不明显
4、序列(sequence)
序列是一种用来生成唯一数字值的数据库对象,序列的值由oracle按照递增或递减顺序自动生成的。通常用来自动生成表的主键值,是一种高效率获取唯一主键值的途径
序列产生连续的不同数字值,是数据库独立的对象,表可以用序列产生的值作为主键值,也可以不用,序列可以为一个或多个表产生主键值。
建议:一个序列为一个表产生主键值
//创建序列 产生从1开始的数字值,步进为1 create sequence first_sequence; select first_sequence.nextval from dual;//下一个值 select first_sequence.currval from dual;//当前值 //创建序列 产生从100开始的数字值 步进10 递增 create sequence second_sequence start with 100 increment by 10; select second_sequence.nextval from dual;//下一个值 select second_sequence.currval from dual;//当前值 create sequence third_sequence start with 100 maxvalue 100 increment by -10;//递减 //创建表 create table user_temp( id number(4) primary key, name varchar2(10) not null ); //创建序列 create sequence user_sequence start with 1000; //插入数据 insert into user_temp values(user_sequence.nextval,'张三');//1001 insert into user_temp values(user_sequence.nextval,'李四');//1002 //查看数据 select * from user_temp;
注意:使用序列产生的值作为表的主键值,插入数据库,有‘延迟段’特性,则跳过第一个产生的数字值