zoukankan      html  css  js  c++  java
  • 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;

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

  • 相关阅读:
    [HDOJ4788]Hard Disk Drive(水题)
    [HDOJ4782]Beautiful Soup(模拟)
    [HDOJ3652]B-Number(数位dp)
    [CF55D]Beautiful numbers(数位dp,状态压缩)
    [HDOJ3555]Bomb(数位DP)
    [HDOJ2089]不要62(数位DP)
    [HDOJ5881] Tea(找规律)
    [HDOJ5900]QSC and Master(区间dp)
    [HDOJ5878]I Count Two Three(暴力枚举,二分)
    [HDOJ5879]Cure(求极限,打表)
  • 原文地址:https://www.cnblogs.com/xslzwm/p/9669131.html
Copyright © 2011-2022 走看看