ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于“TO"锁的一些研究

关于“TO"锁的一些研究

原创 Linux操作系统 作者:yezhibin 时间:2011-03-18 15:21:50 0 删除 编辑
         在客户现场中,查看v$logk.type出现大量的TO  (temporary object),该锁类型

很少触及到,不知道对数据库有多大影响,因此编写以下的测试程序进行检测:

1、创建事务型临时测试表

SQL>connect test/test
 SQL>create global temporary table t1(
                         date_ord   date constraint t1_dto_nn not null,
                          seq_ord    number(6)  constraint t1_sqo_nn not null,
                          small_vc   varchar2(10),
                          big_vc     varchar2(40)
                        ) on commit preserve rows;

2、创建sequence

SQL>create sequence t1_seq;

3、创建存储过程
SQL>connect /as sysdba
SQL>grant execute on dbms_lock to test;
SQL>connect test/test

create or replace procedure t1_load(i_tag varchar2) as
       m_date  date;
       m_big_vc  varchar2(40);
       m_start_time  date;
       m_end_time  date;
 BEGIN
    dbms_output.put_line(
         dbms_lock.request(
             1,dbms_lock.s_mode, release_on_commit=>true)
          );
     commit;
    
    m_start_time := sysdate;
    for i in 0..40 loop
        m_date := trunc(sysdate)+i;
        m_big_vc := rpad('x',40);
        for j in 1..200 loop
           insert into t1 values(
               m_date,
               t1_seq.nextval,
               i_tag||j,
               m_big_vc
               );
            commit;
            dbms_lock.sleep(0.01);
         end loop;
      end loop;
     m_end_time :=sysdate;
     dbms_output.put_line('Interval Time ['||i_tag||'] ='||trunc(86400*(m_end_time-m_start_time))||'Seconds');
   end;
   /
4、测试,启动用户锁,让多个session同时进行插入动作
session 1:
SQL>BEGIN
             dbms_output.put_line(
                 dbms_lock.request(
                         1, dbms_lock.x_mode,
                          release_on_commit=>true)
                     );
 end;
 /
**************************************
加载多个并行插入进程
**************************************
session 2:
SQL>exec t1_load('A');

session 3:
SQL>exec t1_load('B');
............

session N:
  SQL>exec t1_load('N');

*******************************
触发多个并行进程执行插入
*******************************
session 1:
SQL> commit;
SQL>select * from v$lock where type='TO';

5、测试结论:
从测试结果中,我们发现大量的TO锁类型,无论并行执行的session数量是多少,

每个session的插入时间没有变化,即使session完成了insert操作, v$lock.type

=TO并不会消失,只有session退出之后才消失。因此对数据库的性能没有影响。



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

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

注册时间:2008-12-18

  • 博文量
    159
  • 访问量
    526919