Oracle-08-事务

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;

注意:使用序列产生的值作为表的主键值,插入数据库,有‘延迟段’特性,则跳过第一个产生的数字值

posted @ 2018-09-18 15:23  不是一个世界的人  阅读(156)  评论(0编辑  收藏  举报