创建索引时对表加什么锁

本文探讨了在未使用online选项创建索引时对数据库DML操作的影响,包括所需的锁类型及其导致的阻塞情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10972173/viewspace-524537/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值