测试环境:
建一个分区表
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提交才能执行后面的。
因此这种方式只适合,并行访问度不高的表;子查询时间短并且插入数据少的操作