关于append并行插入分区引起锁等待问题

来源:互联网 发布:拍照解题软件 编辑:程序博客网 时间:2024/05/17 03:52

测试环境:

建一个分区表

create table T_A

(

    B  NUMBER,

    A  NUMBER
)
partition by list (A)
(

partition P1001 values (1),

partition P1001 values (2),

partition P1001 values (3),

partition P1001 values (4),

partition P1001 values (5),

partition P1001 values (6)
);

测试1 :将以下的语句同时执行
报错ora-12838 无法在并行模式下访问修改行

insert /*+ append */ into t_a values(1,1);

select * from T_A;

 

测试2 :将一下语句分两个session执行,但是都不提交
发现 第一插入成功第二个session 一直等待

 

insert /*+ append */ into t_a values(1,1);

 

insert /*+ append */ into t_a values(1,2);

 

 

----查看第一个语句 锁的资源信息 LOCKED_MODE 分0-6等 6是排他锁所级别最高

select t1.OBJECT_ID ,t1.LOCKED_MODE
from v$locked_object t1
Where t1.SESSION_ID In(171)
--发现第一个session将所有的分区都锁上了
Select *
  From Dba_Objects T2
 Where T2.Object_Id In
       (5948621, 5948622, 5948624, 5948627, 5948626, 5948625, 5948623)

 

结论:/*+ append */标记在使用的时候插入时,会将访问的对象
上一个最高级别锁,将所有分区上锁,并且被锁住的对象无法访问,必须等到前一个
session提交才能执行后面的。
因此这种方式只适合,并行访问度不高的表;子查询时间短并且插入数据少的操作