Oracle 单实例与RAC锁

20 篇文章 0 订阅
6 篇文章 0 订阅

 

会产生4级表锁的几种情况:

  • bitmap索引
--session 1
SQL> create table t1_tx(id number,name varchar2(20)) ;

Table created.

SQL> insert into t1_tx select rownum,chr(97+mod(rownum,2)) from dual connect by level<=10;

10 rows created.

SQL> commit;

Commit complete.

SQL> select * from t1_tx;

        ID NAME
---------- ----------------------------------------
         1 b
         2 a
         3 b
         4 a
         5 b
         6 a
         7 b
         8 a
         9 b
        10 a

10 rows selected.

SQL> create bitmap index idx_bitmap_name on t1_tx(name);

Index created.

SQL> select sid from v$mystat where rownum=1;

       SID
----------
        63

SQL> update t1_tx set name='tx' where id=3;

1 row updated.

SQL> -- not commit

-- session 2:
SQL> select sid from v$mystat where rownum=1;

       SID
----------
         5

SQL> update t1_tx set name='bitmap' where id=5;
--hang
 
---session 3
SQL> select sid,
  2         chr(bitand(p1, -16777216) / 16777215) ||
  3         chr(bitand(p1, 16711680) / 65535) "Name",
  4         (bitand(p1, 65535)) "Mode",
  5         event,
  6         sql_id,
  7         FINAL_BLOCKING_SESSION
  8    from v$session
  9   where event like 'enq%';

       SID Name                   Mode EVENT                          SQL_ID                     FINAL_BLOCKING_SESSION
---------- ---------------- ---------- ------------------------------ -------------------------- ----------------------
         5 TX                        4 enq: TX - row lock contention  1qtvgrv88q2dj                              63
  • 主外键关系,主键表插入数据不提交,外键表插入数据被阻塞
--session 1
SQL> create table parent(id number primary key);

Table created.

SQL> create table child(id number references parent,name varchar2(20));

Table created.

SQL> insert into parent values(1);

1 row created.

SQL>--not commit;

--session 2:
SQL> insert into child values(1,'a');
--hang

--session 3:
SQL> l
  1  select sid,
  2         chr(bitand(p1, -16777216) / 16777215) ||
  3         chr(bitand(p1, 16711680) / 65535) "Name",
  4         (bitand(p1, 65535)) "Mode",
  5         event,
  6         sql_id,
  7         FINAL_BLOCKING_SESSION
  8    from v$session
  9*  where event like 'enq%'
SQL> /

       SID Name                   Mode EVENT                          SQL_ID                     FINAL_BLOCKING_SESSION
---------- ---------------- ---------- ------------------------------ -------------------------- ----------------------
         5 TX                        4 enq: TX - row lock contention  d8gc19unfrcsw                              63
  • 插入同一主键值
--session 1:
SQL> create table mytab(id number primary key);

Table created.

SQL> insert into mytab values(1);

1 row created.

SQL>

--session 2:
SQL> insert into mytab values(1);
--hang

--session 3:
SQL> l
  1  select sid,
  2         chr(bitand(p1, -16777216) / 16777215) ||
  3         chr(bitand(p1, 16711680) / 65535) "Name",
  4         (bitand(p1, 65535)) "Mode",
  5         event,
  6         sql_id,
  7         FINAL_BLOCKING_SESSION
  8    from v$session
  9*  where event like 'enq%'
SQL> /

       SID Name                   Mode EVENT                          SQL_ID                     FINAL_BLOCKING_SESSION
---------- ---------------- ---------- ------------------------------ -------------------------- ----------------------
         5 TX                        4 enq: TX - row lock contention  2srnv7c1ummk0                              63
  • ITL(事务槽)争用,其实这个可以明显看出来,因为在10g后,就已经有enq:TX – allocate ITL entry,但是我在这里还是把它分类在mode=4的TX锁。

关于该等待可参考 

模拟enq: TX – allocate ITL entry等待 – 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 17813235971 - 惜分飞

请将域名解析至正确的IP地址 - 无忧主机

关于等待事件enq: TX - allocate ITL entry的一次故障处理_killvoon的博客-CSDN博客_allocation itl entry

注:9.2.0.8环境,因为10g以上环境,设置maxtrans无效,自动变成255
--session 1
SQL> create table test(x number) initrans 2 maxtrans 2;

Table created.

SQL> insert into test select rownum from dual connect by level<=3;

3 rows created.

SQL> commit;

Commit complete.

SQL> select * from test;

         X
----------
         1
         2
         3

SQL>
SQL> update test set x=99 where x=1;

1 row updated.

SQL>

--session 2
SQL> update test set x=99 where x=2;

1 row updated.

SQL>

--session 3:
SQL> update test set x=99 where x=3;
--hang
  • 索引分裂,会伴随着enq: TX – index contention的等待。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值