ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 创建索引时对表加什么锁

创建索引时对表加什么锁

原创 Linux操作系统 作者:lsq_008 时间:2008-12-29 11:33:04 0 删除 编辑

1. 在没有加online选项的情况下,创建索引

session 1:

SQL> select sid from v$mystat where rownum=1;
 
       SID
----------
        10
 
SQL> create index idx_test tablespace b2cspace on test(object_id,object_name);
create index idx_test tablespace b2cspace on test(object_id,object_name)
                      *
ERROR at line 1:
ORA-00969: missing ON keyword
 
 
SQL>  create index idx_test on test(object_id,object_name) tablespace b2cspace;
 
Index created.

在session 1创建索引同时,session 2 执行:

SQL> select sid from v$mystat where rownum=1;
 
       SID
----------
        11
 
SQL> update test set object_name=1 where rownum=1;
 
1 row updated.

session 3观察数据库里锁的信息:

SQL>  select * from v$lock where sid in(10,11)
  2  ;
 
ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
579580EC 579581F8         10 TX     262188       4838          6          0         28          0
57942C34 57942C48         10 TM         18          0          3          0         28          0
57942BB0 57942BC4         10 TM       6657          0          4          0         28          1
56D0ED5C 56D0ED6C         10 DL       6657          0          3          0         28          0
57942CB8 57942CCC         11 TM       6657          0          0          3         13          0

     可见,在这种情况下,创建索引时需要获得TX锁,共享的TM锁,以及一个DL锁。而且,这会堵塞其它session的DML操作。另外,还可以看到对表OBJ$也加了TM锁类型的锁。

     进一步模拟当加S模式的TM锁时,对update操作的影响:

session 1:

SQL> lock table test in share mode;
 
Table(s) Locked.

session 2:

SQL> update test set object_name=1 where rownum=1;
 

hang住

session 3:

SQL> select * from v$lock where sid in(10,11);
 
ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
57942BB0 57942BC4         10 TM       6657          0          4          0        324          1
57942C34 57942C48         11 TM       6657          0          0          3        310          0

可见,session2 被session 1阻塞。

再进一步查看对insert操作的影响:

session 4:

SQL> insert into test select * from test where rownum=1;
 

hang住

在session 3里再次查看锁的情况:

SQL> select * from v$lock where sid in(10,11,21);
 
ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
57942BB0 57942BC4         10 TM       6657          0          4          0        720          1
57942C34 57942C48         11 TM       6657          0          0          3         61          0
57942CB8 57942CCC         21 TM       6657          0          0          3          6          0

结论:

(1) 当不用online选项创建索引时,将对表加S模式的TM锁,这直接造成对DML操作的阻塞。

(2)进行DML操作时,将首先获得TM类型的表级意向锁,然后才能获得TX类型的事务锁。
 

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

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1254884