• DTL+数据字典+序列、索引、视图


    1.DTL事务语言

    DTL,数据事务语言
    
    1.事务是指一组相关的SQL操作,我们所有的操作多事事务中的。
       注意:在数据库中,执行业务的基本单位是【事务】,不是某一条SQL
             数据库在默认情况下,事务都是打开的,也就是说它一直处在事务的当中的,
    一个事务的结束,代表着下一个事务的开启。 (执行commit或者rollback指令时,会结束当前事务)
    2. 事务的作用是用来保证数据的平稳性和可预测性 3.事务的四大特性(数据库事务正确执行的四个基本要素的缩写:ACID) a.原子性:Atomicity b.一致性:Consistency c.隔离性:Isolation d.持久性:Durability 一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程
    (Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交
    易方的要求。
    4.在oracle中,操作事务的命令: a.commit,提交事务;把事务中的所有的数据持久化到磁盘中 b.rollback to 回滚点,回滚事务;把事务中所做的操作全部取消,回到初始化状态 c. savepoint 回滚点,设置回滚点;事务回滚时,回滚到起点 总结: (1)目前主流的数据库都是支持事务的,而且其中oracle支持的最好 (2)一个事务不能读取到另一事务还没有提交的数据 (3)DDL语句都会自动提交事务 (4)DML语句不会自动提交事务,需要手动提交commit ------------------------------------------------ 5.多事务的并发处理机制: a.脏读(dirty read):一个事务读取到了另外一个事务没有提交的数据 事务1:更新一条数据 事务2:读取事务1更新的记录 事务1:调用commit进行提交 此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。 读到的数据为脏数据 详细解释: 脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改
    还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这
    个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数
    据是脏数据,依据脏数据所做的操作可能是不正确的。 b. 不可重复读:在同一事务中,两次读取同一数据,得到内容不同 事务1:查询一条记录 事务2:更新事务1查询的记录 事务2:调用commit进行提交 事务1:再次查询上次的记录 此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读。 c. 幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同 事务1:查询表中所有记录 事务2:插入一条记录 事务2:调用commit进行提交 事务1:再次查询表中所有记录 此时事务1两次查询到的记录是不一样的,称为幻读 详细解释: 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中
    的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也
    修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生
    操作第一个事务的用户发现表中还有没有修改的数据行, 就好象发生了幻觉一样。 Oracle中采用‘锁’来做并发处理
    1.表级排它锁(X) exclusive mode 2.表级共享锁(S) share mode 3.表中行级排它锁 share row exclusive 注:这三种锁是通过专门的命令来申请的 语法: lock table tbl_name in mode; 例如: --以共享锁锁表 lock table tbl_emp in share mode; --以排它锁锁表 lock table tbl_emp in exlusive mdoe; **4.行级共享锁(RS) row share **5.行级排它锁(RX) row exclusive(专用的; 高级的;排外的;单独的) 注:这两种锁无需通过专门的命令申请,而是通过DQL和DML来自动申请的 注意: 1.所有的DQL语句默认情况下都会自动申请RS锁 2.所有的DML语句默认情况下都会自动申请RX锁,每一行记录都会唯一的RX锁 3.在项目中,为了满足业务要求,一般select语句需要申请RX锁 select语句通过for update来申请RX锁: select * from s_emp for update; select * from s_emp for update wait 5;等待5秒 select * from s_emp for update nowait; a 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时
    加上共享锁后(这样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何
    事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更无权
    参与进来读写,这样就防止了脏读问题。 但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修
    改数据,修改完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,
    所以这样不能够避免不可重复读问题。 b
    不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候
    不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题 c
    幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。

    2.其它数据库对象:序列(sequence)、索引(index)、视图(view)

    
    其他数据库对象:
    序列(SEQUENCE)
    索引(INDEX)
    视图(VIEW)
    
    1.序列(SEQUENCE)
    对应的数据库字典:user_sequences
    作用:用来产生唯一性值的数据库特殊对象
    
    创建序列语法:
    create sequence 序列名
    start with n     表示从几开始,默认值是1
    increment by n    每计数一次增加多少,默认是1
    maxvalue n        序列最高峰值n
    minvalue n        序列最低峰值n
    cache n            提供n个预分配的序列,保存在内存中
    cycle | nocycle    是否循环
    oredr | noorder    有序还是无序序列
    
    例如:
    --给员工创建一个序列
    create sequence tbl_emp_id start with 4;
    
    如何使用序列?
    nextval:取序列的下一个值(tbl_emp_id.nextval)--第一次取start with后面的值
    currval:取序列的当的前值(tbl_emp_id.currval)
    
    在插入数据时使用:
    insert into tbl_emp values(tbl_emp_id.nextval,....)
    
    删除序列:
    drop sequence 序列名;
    ---------------------------------------------------
    2.索引(INDEX)
    对应的数据词典user_indexes
    
    它是一个比较重要的数据库对象,作用是可以有效的提高数据库的查询效率(数据库性能优化)
    
    创建索引的两种方式:
    1自动创建
    当表中的列添加了主键约束或者唯一性约束时,则系统会自动为此列创建唯一性的索引,索引名就是约束名
    
    2手动创建
    语法:
    create index 索引名 on 表名(列名...);
    
    注意:
    1.索引有自己独立的储存空间和命名空间
    2.创建索引也会相对牺牲一些数据库性能
    
    索引的原理:
    1.默认情况下,索引是采用BTree(二叉树)的数据结构
    2.伪劣(rowid),存放的数据行记录的正真“物理地址”。
    
    --根据某物理地址查询某一行记录
    //先获取记录的rowid
    select rowid from s_emp where first_name="Carmen"//根据行记录rowid查找相应的记录
    select* from s_emp where rowid='............'
    
    3.索引建立的原理:
    把创建索引的列值与rowid合成一个键值树,这个键值对就是索引,然后把它们存放到指定的数据结构中(二叉树,位图)中,并且是独立的索引空间
    
    4.索引查询的原理:
    当我们的查询语句中where 条件的列建立了索引,则查询分为一下2步:
    a.先查索引,在句列中的值直接找到rowid
    b.根据第一步得到的rowid直接定位到相应的行记录结束查询
    
    5.建立索引的策略:
    a.主键和唯一性列    合适
    b.不经常发生改变的列    合适
    c.满足以上两个条件,经常做查询的列    合适
    d.重复值太多的列    不合适
    e.null值太多的列    不合适
    
    6.删除索引
    
    drop index 索引名;
    -----------------------------------------------------
    3.视图(VIEW)
    对应的数据字典:user_view
    他是一个数据库对象,它的表格的一个“窗口”,用来保存查询语句的对象,视图是依附与表的,并且与表格共享储存空间。
    
    定义:本质就是一条合法的查询语句
    
    作用:
    1.配合权限,根据业务来做分级管理
    2.减少复杂性,增加数据的安全性
    
    创建视图的语法:
    create view 视图名 as 子句;
    with read only ;视图只读,不可修改。但是表中的内容可改并且视图内容和表一致。
    with check option; 
    
    例如:
    --以只读方式创建s_emp表中id,salary两列的视图
    create view view_name as select id,salary from s_emp with read only;
    注意:操作视图必须拥有一定的权限
    
    删除视图
    drop view 视图名;
    
    视图分类:
    关系视图,内嵌视图,对象视图,物化视图
    -----------------------------
    补充:查询当前用户可执行什么操作
    select * from session privs;
    
    --查询某个权限可执行的所有操作
    select* from DBA_SYS_PRIVS where grantee='DBA';(需要DBA)
    
    --查询当前用户被赋予的系统角色
    select *from SESSIONS_ROLES order by role;
    
    --授予权限的两种方式:
    1.grant create any view to 用户名
    2.grant connect,resource,dba to 用户名
    
    练习:
    --创建41部门所有员工的简单视图(必须拥有操作视图的权限)
    create view view_emp_41 as select * from s_emp where dept_id=41;
    select * from view_enp_41;--查看这个视图。

    3.数据字典

    数据字典是用来描述用户对象的对象。
    Oracle本质:
    Oracle是一个用表(系统表)来维护表(用户表)的数据库系统,这里的系统表就是我们所说的数据可字典
    Oracle数据库定义的数据字典都遵循一定的命名规则,它内置了上千张表
    
    命名规则:
    前缀_数据库对象加s/es
    常用的前缀:
    user
    all
    dba
    $
    常用数据库对象
    table,user,constraint,sequence,index,view...
    
    常用数据字典:
    user_users        存放用户的信息
    user_tables        存放用户表的信息
    user_constraints存放表中约束的信息
    user_sequences    存放序列的信息
    user_indexes    存放索引的信息
    user_views        存放视图的信息
    suer_cons_columns存放约束与列对应关系的信息
    
    --查看当前用户下有哪些约束
    select * from user_constraints ;
    --查看当前用户下有哪些表格
    select * from user_tables;
    --查看emp表中所有的约束名和约束类型
    select constraint_name,constraint_type from user_constraints where table_name='EMP'; 注意:此处表名要大写
    --查看当前用户(scott)下所有状态不可用的约束名字,以及该约束作用的表格名
    select constraint_name,table_name
    from user_constraints
    where status = 'DISABLED';
  • 相关阅读:
    P1073 最优贸易
    window.btoa()方法;使字符编码成base64的形式
    centOs7 忘记root密码
    window.addEventListener()/window.postMessage(”text“, '*')
    $(function(){})理解
    跨域资源共享/option 请求产生原因
    Angular: Can't bind to 'ngModel' since it isn't a known property of 'input'问题解决
    TypeScript
    盒子模型
    理解事件捕获等
  • 原文地址:https://www.cnblogs.com/lxy151/p/7818858.html
Copyright © 2020-2023  润新知