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;

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

  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/xslzwm/p/9669131.html
Copyright © 2011-2022 走看看