Oracle使用append对表insert会阻塞表的其他会话DML操作
Oracle使用append对表insert会阻塞其他会话DML操作
快春节了,抽点时间把NNNNNNN久之前的东西整理记录。
insert /*+ append */ into会对表持有LOCKED_MODE=6的TM锁,导致其他对该表的DML都会被阻塞。
正常的insert into对比。
开启两个会话,sid1=173,sid2=489。
两个会话同时运行:
--173 11:18:07 SYS@test1(173)> insert into "ZKM"."T1" select * from "ZKM"."T1"; --489 11:18:08 SYS@test1(489)> insert into "ZKM"."T1" select * from "ZKM"."T1";
SQL运行期间查看该表锁以及等待事件情况,均持有3号锁,并且没有被阻塞:
11:22:10 SYS@test1(24)> select lo.session_id,l.TYPE,lo.LOCKED_MODE from v$locked_object lo,v$lock l where lo.object_id in (select object_id from dba_objects where owner='ZKM' and object_name='T1') and lo.session_id=l.sid and l.type='TM'; SESSION_ID TYPE LOCKED_MODE ---------- ------ ----------- 489 TM 3 173 TM 3 Elapsed: 00:00:00.03 11:21:12 SYS@test1(330)> select sid,event,status,state,blocking_session from v$session where sid in ('173','489'); SID EVENT STATUS STATE BLOCKING_SESSION ---------- ----------------------------------- ------------------------ --------------------------------------------------------- ---------------- 173 buffer busy waits ACTIVE WAITED SHORT TIME 489 buffer busy waits ACTIVE WAITED SHORT TIME Elapsed: 00:00:00.00
接下来sid1=173执行append的insert,sid2=489还是执行普通的insert,先后执行:
--先173 11:42:47 SYS@test1(173)> insert /*+ append */ into "ZKM"."T1" select * from "ZKM"."T1"; --紧接着489 11:42:48 SYS@test1(489)> insert into "ZKM"."T1" select * from "ZKM"."T1";
卡住等待......
SQL运行期间查看该表锁以及等待事件情况,sid1=173先执行先持有6号模式的独占锁(X),阻塞了sid2=489,并且sid2=489想要REQUEST(请求)的锁模式为3:
11:42:50 SYS@test1(24)> select lo.session_id,l.TYPE,lo.LOCKED_MODE,l.REQUEST from v$locked_object lo,v$lock l where lo.object_id in (select object_id from dba_objects where owner='ZKM' and object_name='T1') and lo.session_id=l.sid and l.type='TM'; SESSION_ID TYPE LOCKED_MODE REQUEST ---------- ------ ----------- ---------- 489 TM 0 3 173 TM 6 0 Elapsed: 00:00:00.02 11:43:39 SYS@test1(330)> select sid,event,status,state,blocking_session from v$session where sid in ('173','489'); SID EVENT STATUS STATE BLOCKING_SESSION ---------- ----------------------------------- ------------------------ --------------------------------------------------------- ---------------- 173 direct path write ACTIVE WAITED SHORT TIME 489 enq: TM - contention ACTIVE WAITING 173 Elapsed: 00:00:00.00
通过对比知道,Hint的append去insert数据,需要注意使用场景,避免阻塞DML引起的生产问题。
分类:
Oracle
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?