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

本文通过测试案例展示了在Oracle数据库中使用/*+append*/标记进行并发插入操作时,会导致整个表及其分区被锁定,直到事务提交。这可能导致长时间的等待甚至ORA-12838错误。

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

测试环境:

建一个分区表

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值