oracle锁---原理篇
摘要:在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select 利用的是undo中的前镜像数据了).Oracle锁的分类Oracle锁基本上可以分为二类a:共享锁(share locks
阅读全文
SML + NL + HJ
摘要:Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更严谨一些,并且将参与连接的2个row source分别称为row source1和row source 2。Join过程的各个步骤经常是串行操作,即使相关的row source可以被并行访问,即可以并行的读取做join连接的两个row source的数据,但是在将表中符合限制条件的数据读入到内存形成row source后,join的其它步骤一般是串行的。有多种方法可以将2个表连接起来,当然每种方法都有自己的优缺
阅读全文
Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
摘要:-varchar,varchar2联系:1.varchar/varchar2用于存储可变长度的字符串比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节2.size 的最大值是 4000,而最小值是 1,其值表示字节数,比如varchar(20)表示最大可以存放20个字节的内容区别:1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;2.VARCHAR2把空串等同于null处理,而varchar仍按照空串处理;3.VARCHAR2字符要用几个字节存储,要
阅读全文
oracle 一致读原理
摘要:在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read)、回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery)。 一致性读是相对于脏读(Dirty Read)而言的。假设某个表T中有10000条记录,获取所有记录需要15分钟时间。当前时间为9点整,某用户A发出一条查询语句:select * from T,该语句在9点15分时执行完毕。当用户A执行该SQL语句到9点10分的时候,另外一个用户B发出了一条delete命令,将T表中的最后一条记录删除并提交了。那么到9点15分时,A用户将返回多少条记录? 如果返回
阅读全文
commit 流程
摘要:COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,在数据库中已经执行了数据更改,所以已经完成了99%的任务,例如:下列操作已经产生: 1.在SGA(Buffer Cache)中已经生成了undo块; 2.在SGA(Buffer Cache)中已经生成了产生改变的数据块和索引块; 3.在REDO LOG BUFFER生成了前面两项的redo信息; 4.依赖于前三项产生的数据量大小以及操作需要的时间,buffer中的数据可能已经 有一部分输出到了磁盘; 5.所有需要的锁已经获得; 当执行COMMIT命令时,只执行如下操作: 1.为事务生成SCN:SCN是ORAC
阅读全文
IMPDP NETWORK_LINK参数
摘要:在《【IMPDP】同一数据库实例不同用户间数据迁移复制——NETWORK_LINK参数》(http://space.itpub.net/519536/viewspace-631571)文章中谈到了使用 NETWORK_LINK参数实现在相同的数据库实例中不同用户的数据复制。只要深刻理解了NETWORK_LINK参数的含义,实现不同数据库实例不同用户间数据迁移复制功能道理是相同的。需求:将ora10g实例中的sec用户数据迁移到secooler实例的housw用户中。实现流程:a.在secooler实例所在的数据库中创建指向ora10g数据库实例的DATABASE LINK;b.使用NETWOR
阅读全文
ORA-01555 snapshot too old
摘要:假设有一张6000万行数据的testdb表,预计testdb全表扫描1次需要2个小时,参考过程如下:1、在1点钟,用户A发出了select * from testdb;此时不管将来testdb怎么变化,正确的结果应该是用户A会看到在1点钟这个时刻的内容。2、在1点30分,用户B执行了update命令,更新了testdb表中的第4100万行的这条记录,这时,用户A的全表扫描还没有到达第4100万条。毫无疑问,这个时候,第4100万行的这条记录是被写入了回滚段,假设是回滚段UNDOTS1,如果用户A的全表扫描到达了第4100万行,是应该会正确的从回滚段UNDOTS1中读取出1点钟时刻的内容的。3、
阅读全文