Oracle知识点

在接下来的三篇关于oracle文章,是在上学期写好的,当时怕忘记,都是一些关于oracle的细节以及易错点,现在贴上来
知识点:

delete与truncate的区别:
  • Delete是DMl(data mutipulation language)语言,truncate是 DDL(data defination language)语言,dml语言可以回滚(rollback),ddl不能
  • Delete是逐条删除,truncate是先把整个表删除了再重建
  • 使用delete删除数据不会释放空间,但truncate会
  • Delete语句会产生碎片,truncate不会
  • Delete可以闪回(flashback),truncate不能
事务的提交与回滚:
  • 提交:commit(显式提交) /遇到DML语句(隐式提交)
  • 回滚:rollback(显式回滚)/[掉线/宕机](隐式回滚)
事务种类
  • 本地事务(只对数据库进行操作):

    • 拿转账作为例子
      Try{
      1.扣钱
      2.目标账户加钱
      3.提交
      }catch(Exception e){
      1.处理事务
      a)回滚
      }
  • 全局事务(Java中对于全局事务支持的框架有JTA,tomcat只支持本地事务,WebLogic和WebSphere都支持全局事务):

    • 拿转账作为例子
      Try{
      1.扣钱
      2.目标账户加钱
      3.在提交之前,有些用户喜欢在到账之前给目标用户短信提醒
      4.提交
      }catch(Exception e){
      1.处理事务
      a)回滚
      }
Oracle的隔离级别

先来数据库的事务隔离级别:
这里写图片描述

Oracle一共有3种隔离级别:read commited 、read only(多线程)、serializable(同步、单线程)

序列的不连续原因:
  • 序列是公共对象,所以有可能有多张表在同时操作序列,所以造成序列的不连续:Table a :1,2,3,5,7
    Table b:4,6

  • 掉电,因为序列在内存中,一掉电就消失,比如我们当前序列指向3,如果现在掉电,那么下一次使用序列从21开始。

  • 回滚
索引

这里写图片描述

  • 那么 什么情况下需要创建索引?

    • 列表中数据值分布范围很广
    • 该列经常出现在where语句中
    • 要访问的表数据量很大,但是我们要查找的内容只占表的2%-4%
  • 那么什么情况不需要创建索引?

    • 表中的数据很少
    • 不经常出现在where语句中
    • 查询的数据大于2%-4%
    • 该表经常更新
同义词:synonym
  • 为数据库对象创建一个别名。(表,视图,序列,索引)
    • 在远程查询其他用户的表内容,需要目标(要查询的表)赋予发出查询指令表权利
    • Grant select on 表名 to 用户名
  • 如果要为某一个用户表创建同义词的话,需要dba权限,要在dba用户下授权给要查询的用户:比如说我要在Scott表创建hr用户下employees表的同义词 Grant create synonmy to scott,Scott拥有了创建同义词的权限之后,在其用户下创建hr员工表的同义词 Create synonmy 同义词名 for hr.employees 也就是说,以后我们查询的数据,可能是来自表,可能是来自视图,也可能来自数据库其他对象,或者来自其他用户下的表
Oracle的事务隔离机制

使用Pl/SQL语句对表中的数据进行操作时,例如给员工涨工资。多个用户对同一张表的操作时,要考虑到Oracle的事务隔离机制,它默认是read commited, 也就是说当操作的用户进行了commit之后,其他用户才能看见修改。
这里写图片描述
当我在sqlDeveloper中执行代码时,控制台输出了Ok之后,我立刻在cmd中以Scott身份登录数据库,并且查询用户的薪水:
这里写图片描述

可以发现,工资并没有涨。在考虑到事务隔离机制之后,我在函数开头使用了rollback,是为了返回刚刚的操作,并且在函数末尾进行了一次commit
这里写图片描述
然后再进行查询:
这里写图片描述

可以看到涨工资后的员工.
注意:一般情况下,不在存储过程和存储函数中commit,而是谁调用,谁提交

存储过程,存储函数的区别:

存储函数可以通过return语句来返回值,但是存储过程不能,在其他方面二者一致
在out参数出来以后,好像存储函数变得没什么用处,
当我们有一个返回值 的时候,使用存储函数,当我们有多个或者0个返回值的时候使用存储过程。
再加上一个原因,因为存储函数是老版本中出现的,在Oracle后面的版本升级中,要注意的向之前版本的兼容,不能升级版本的时候,以前写好的程序跑不起来了。

thread dump:
  1. 使用thread dump可以对java程序进行故障分析(死锁) 和瓶颈调优
  2. b)Win环境:CTRL+break
  3. c)Linux: kill -3
  4. d)Win环境下的部分截图:这里写图片描述
语句级触发器和行级触发器
  1. 语句级触发器不用加 for each row
  2. old 和:new只对行级触发器起作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值