在接下来的三篇关于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:
- 使用thread dump可以对java程序进行故障分析(死锁) 和瓶颈调优
- b)Win环境:CTRL+break
- c)Linux: kill -3
- d)Win环境下的部分截图:
语句级触发器和行级触发器
- 语句级触发器不用加 for each row
- old 和:new只对行级触发器起作用