查看T2的事务槽
Select aa.ini_trans,aa.max_trans From dba_tables aa Where table_name='T2'
Create Table t10(Id Int);
Insert Into t10 values(1);
Insert Into t10 values(2);
Insert Into t10 values(3);
查看数据在快上分布的位置
Select Id,dbms_rowid.rowid_relative_fno(Rowid) file#,
dbms_rowid.rowid_block_number(Rowid) block# From t10
一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,直到这个事务提交释放这个事务槽
只有在已经提交以后,这个itl事务槽中的scn才会有数值。
一个事务在一个数据块上占用一个事务槽
如果是insert,默认每个表的ini_trans itl是2,尽量保持这个数据块的事务数不超过2,
采用在多个数据块中插入的情况。这样将insert分布到多个数据块中,防止了itl的争用。
三个会话同时修改一个数据块。
事务槽自己增加到了3个。
因为max_trans是255,因此发生ITL争用的几率也很小。
因此基于上面的两种情况来说,ITL发生争用的几率很小。
Cleanout有2种:
1:fast commit cleanout (提交清除)
2:delayed block cleanout(延迟清除).
提交清除是如何工作的?
Oracle会记录已修改的块列表,这些列表可以有20个块,Oracle根据需要分配多个这样的列表,
但是如果这些修改的块加起来超过buffer_cache的10%,oracle就停止分配这样的列表,因此
当提交时就只会清理最多10%buffer_cache的数据块,其余的部分就延迟清除,这样也是为了
提高commit的效率。U
还有一种情况,就是当事务还未commit时,修改的数据块已经写入硬盘,当发生commit时
oracle并不会把block重新读入做cleanout,而是把cleanout留到下一次对此块的访问是完成。
注意:对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交。目的都是为了提高提交的速度。
提交以后,oracle需要对ITL事务槽、每一行的锁定标记进行清除。
如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。但是锁定标记可能没有清除,等下次用到的时候再进行清除。
如果是延迟提交,那么在提交的时候,只是将事务表进行清除,并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。
块清除的过程并不包括每个行的锁定标记的清除,主要指的是ITL的清除。
1、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确
2、事务槽中的事务id和uba地址是准确的
3、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。
4、每一个回滚段块中都有一个事务id,记录哪个事务正在使用这个块。
5、回滚事务表可能被覆盖,回滚段也可能被覆盖
对于前者,我们需要增加回滚段
对于后者,我们需要增大回滚段
回滚段也是循环使用的,只有活动的回滚段不会被覆盖
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10678398/viewspace-720935/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10678398/viewspace-720935/