暂无图片
并行更新或插入会锁全表嘛?
我来答
分享
TAO
2022-01-19
并行更新或插入会锁全表嘛?

session1:
SQL> create table test (id number,name varchar(20));
SQL> select distinct sid from v$mystat;
SID
----------
62
SQL> alter session force parallel dml;
SQL> insert /* +parallel(4) */ into test select rownum,'aa'||rownum from dual connect by level < 10000;

session2:
SQL> select distinct sid from v$mystat;
SID
----------
60
SQL> insert into test t values(0,'aa1');
-----hang住了


session1:
SQL> commit; Commit complete.
SQL> update /* +parallel(4) */ test set name='JJJJ' where id< 5000;
4999 rows updated.

session2:
SQL> insert into test t values(0,'aa1');
-----hang住了
SQL> select decode(request,0,'holder: ','waiter: ') ||
2 sid session_id,lmode, request, type
3 from v$lock
4 where (id1, id2, type) in (select id1, id2, type from v$lock where request > 0)
5 order by request;
SESSION_ID   LMODE   REQUEST   TY
----------        -----        --------       --
holder: 62       6             0               TM
waiter: 60        0             3              TM 


请问并行更新或插入会锁全表嘛?什么原理?

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
cqiwen
{ instance: 1 (cqiwendb.cqiwendb1) os id: 29023 process id: 48, oracle@sdb01 (TNS V1-V3) session id: 17 session serial #: 22255 } is waiting for 'enq: TM - contention' with wait info: { p1: 'name|mode'=0x544d0003 p2: 'object #'=0x1791a p3: 'table/partition'=0x0 time in wait: 8.735503 sec timeout after: never wait id: 99 blocking: 0 sessions current sql: insert into test2022 values(0,'aa1') short stack: ksedsts()+465<-ksdxfstk()+32<-ksdxcb()+1927<-sspuser()+112<-__sighandler()<-semtimedop()+10<-skgpwwait()+178<-ksliwat()+2066<-kslwai tctx()+163<-kjusuc()+3400<-ksipgetctxi()+1759<-ksqcmi()+20798<-ksqgtlctx()+3501<-ktaiam()+712<-ktagetp_internal()+2006<-ktaadm()+258<-kksfbc()+2296<-opiexe()+ 2330<-kpoal8()+2380<-opiodr()+917<-ttcpip()+1255<-opitsk()+1710<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-m ain()+201<-__libc_start_main()+253 wait history: * time between current wait and wait #1: 0.001121 sec 1. event: 'SQL*Net message from client' time waited: 0.000132 sec wait id: 98 p1: 'driver id'=0x62657100 p2: '#bytes'=0x1 * time between wait #1 and #2: 0.000111 sec 2. event: 'SQL*Net message to client' time waited: 0.000003 sec wait id: 97 p1: 'driver id'=0x62657100 p2: '#bytes'=0x1 * time between wait #2 and #3: 0.000026 sec 3. event: 'SQL*Net break/reset to client' time waited: 0.000199 sec wait id: 96 p1: 'driver id'=0x62657100 p2: 'break?'=0x0 } and is blocked by => Oracle session identified by: { instance: 1 (cqiwendb.cqiwendb1) os id: 20694 process id: 54, oracle@sdb01 (TNS V1-V3) session id: 395 session serial #: 15131 } **which is waiting for 'SQL*Net message from client'** with wait info: { p1: 'driver id'=0x62657100 p2: '#bytes'=0x1 time in wait: 16.711944 sec timeout after: never wait id: 955 blocking: 1 session current sql: <none> short stack: ksedsts()+465<-ksdxfstk()+32<-ksdxcb()+1927<-sspuser()+112<-__sighandler()<-read()+14<-ntpfprd()+117<-nsbasic_brc()+396<-nsbrecv()+6 9<-nioqrc()+495<-opikndf2()+978<-opitsk()+831<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-main()+201<-__libc_ start_main()+253 wait history: * time between current wait and wait #1: 0.000021 sec 1. event: 'SQL*Net message to client' time waited: 0.000005 sec wait id: 954 p1: 'driver id'=0x62657100 p2: '#bytes'=0x1 * time between wait #1 and #2: 0.000536 sec *** 2022-01-19 17:26:05.763 2. event: 'PX Deq: Signal ACK RSG' time waited: 0.000000 sec (last interval) time waited: 0.015107 sec (total) wait id: 950 p1: 'sleeptime/senderid'=0xa p2: 'passes'=0x2 * time between wait #2 and #3: 0.000000 sec 3. event: 'PX Deq: reap credit' time waited: 0.000016 sec wait id: 953 } Chain 1 Signature: **'SQL*Net message from client'<='enq: TM - contention'** Chain 1 Signature Hash: 0x163c4cba
复制

这是抓的包,参考下面第8条:
TM锁在下列场景中被申请:

1.在OPS(早期的RAC)中LGWR会以ID1=0 & ID2=0去申请该队列锁来检查 DML_LOCKS 在所有实例中是全0还是全非0。

  1. 当一个单表或分区需要做不同的表/分区操作时,ORACLE需要协调这些操作,所以需要申请该队列锁。

  2. 启用参考约束referential constraints

  3. 修改约束从DIASABLE NOVALIDATE 到DISABLE VALIDATE

  4. 重建IOT

  5. 创建视图或者修改ALTER视图时可能需要申请该队列锁

  6. 分析表统计信息或validate structure时

8. 一些PDML并行DML操作

  1. 所有可能调用kkdllk()函数的操作
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
安装Oracle11g的时候没有插网线,现在插上网线,监听起不来了,如何处理?
回答 6
不接网线的时候好用吗?
crs集群alert日志报错
回答 5
那参加节点2改回来吧,历史日志文件可以不管了
Oracle 统计一天每小时数据增长量的sql
回答 2
已采纳
建立一个作业,每隔一个小时把表空间大小的数据存入一张表,之后查这张表就行了。另外如果只是查最近几天的,oracle有一张表有记录selectb.name,a.TABLESPACESIZE,a.TABL
ASM磁盘里的备份文件怎样能拷贝到其他存储介质上
回答 4
加一块盘到ASM磁盘组里,做重平衡,然后把盘卸掉
oracle 11.2.0.4 aud审计文件生成过快
回答 13
1、是不是有大量的短链接?2、感觉可能是bug,之前碰到过一次rman的bug,导致生成大量的audit
Varchar2 和 char 之间的主要区别是什么
回答 1
已采纳
oracle中char与varchar2的区别1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的,比如,存储字符串“abc&quot;,对于CHAR(20),表示你存储的字符将占20个字
Oracle 19C RAC 安装报错:VIP 的subnet 配置有问题
回答 2
已采纳
可能hosts配置里带有特殊符号了,检查一下文件,或者用vi重新写一个
"检查未压缩的,未分区的堆表CITIES的详细信息。 Name Null? Type
回答 1
已采纳
正确的选项是C,即在执行ALTERTABLEcitiesSHRINKSPACECOMPACT;命令之前,必须确保行移动功能被启用。其他选项要么不是必要的前提条件,要么与实际操作不符。
Oracle ogg停止了, 错误代码是 ERROR OGG-01161
回答 2
是异构的话,从源端重新导一份def文件。
Windows2008R2操作系统使用PL/SQL Dev11和instantclient_12_2连接AL32UTF8编码11.2.0.4数据库,where条件使用中文进行过滤,没有结果返回
回答 1
1、把sql拷贝到服务器上sqlplus执行,如果也有问题,那就是sql中的字符非UTF82、检查数据库字符集,确保数据库字符集和查询sql的编码一致。3、更换其它工具测试,排除PL/SQL软件的问题
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~