ITPub博客

首页 > 数据库 > Oracle > Oracle的INITRANS与事务

Oracle的INITRANS与事务

原创 Oracle 作者:波仔strong 时间:2018-04-22 12:30:42 0 删除 编辑

Oracle的INITRANS与事务


每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足够的自由空间)。所分配的每个事务条目需要占用块首部中的23~24 字节的存储空间。注意,对于Oracle 10g,MAXTRANS 则会忽略,所有段的MAXTRANS 都是255。


由于oracle块里有一个PCT_free的概念,即oracle会预留块大小的10%作为缓冲,当修改oracle的事务增加时,事务槽向下增长,当更新oracle块的数据时,数据向上增长,PCT_free的空间被压缩。这里我们只是看INITRANS的作用,所以pctfree 0

SCOTT@hyyk> create table t3 (id int, num int ) INITRANS 1 pctfree 0 ;


SCOTT@hyyk> select TABLE_NAME,STATUS,PCT_FREE,PCT_USED,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE from user_tables where table_name='T3';

可以看到pctfree 0 参数生效 这里的INITRANS初始值是1


SCOTT@hyyk> insert into t3 values(1,1) ;

SCOTT@hyyk> insert into t3 values(2,2);

SCOTT@hyyk> insert into t3 values(3,3);

SCOTT@hyyk> commit;


SCOTT@hyyk> select id,num ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from T3;


    ID     NUM     FILE# BLOCK#

---------- ---------- ---------- ----------

     1     1     4    581

     2     2     4    581

     3     3     4    581

可以看到插入的三行数据都在4号文件的581块


会话1

SCOTT@hyyk> update t3 set num=11 where id =1; //这里不提交


查看事务,可以发现已经开始一个事务,占据了一个事务槽080011007A050000


会话2

SCOTT@hyyk> update t3 set num=11 where id =2;


1 row updated. //发现这里可以插入

这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)


再次查看事务,又开始了一个事务,事务xid 06001B0075050000


会话三

SCOTT@hyyk> update t3 set num=11 where id =3

...等待


因为事务表没有槽位


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31485142/viewspace-2153182/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2017-08-25

  • 博文量
    87
  • 访问量
    91912