oracle breakable parse lock 易碎解析锁

非常旧的一个概念了,今天被人问起,本来是想直接google一个让他看,可是半天也没找到一个比较好的对此问题解释的文章。
breakable parse lock
叫它锁比较牵强,一般锁是为了保护并发修改的,但是它的含义更准确的说是:一个SQL语句或着PL/SQL等对象在其依赖对象上加的/注册上的 一个“依赖”,以null级别的library cache lock的形式表示出来。当其依赖对象进行DDL等变更的时候,通过查看其上注册列表,然后让这些对象失效。文字还是比较绕,举个例子就很清楚了
select count(*) from b;
这个SQL语句或者叫cursor就在其依赖对象B上加了一个null的library cache lock。如果哪天B进行了DDL操作了,ORACLE查看B上注册的依赖列表,就知道该让哪些依赖对象失效了。


简单的实验:(11.2.0.3)
select count(*) from b where rownum<1;
select count(*) from b where rownum<2;
select count(*) from b where rownum<4;
select count(*) from b where rownum<3;
-------------------dump共享池
Alter session set events 'immediate trace name library_cache level 10';
SELECT A.VALUE || B.SYMBOL || C.INSTANCE_NAME || '_ora_' || D.SPID ||
       '.trc' TRACE_FILE
  FROM (SELECT VALUE FROM V$PARAMETER WHERE NAME = 'user_dump_dest') A,
       (SELECT SUBSTR(VALUE, -6, 1) SYMBOL
          FROM V$PARAMETER
         WHERE NAME = 'user_dump_dest') B,
       (SELECT INSTANCE_NAME FROM V$INSTANCE) C,
       (SELECT SPID
          FROM V$SESSION S, V$PROCESS P, V$MYSTAT M
         WHERE S.PADDR = P.ADDR
           AND S.SID = M.SID
           AND M.STATISTIC# = 0) D;


/u01/app/oracle/diag/rdbms/dlsp/dlsp/trace/dlsp_ora_15991268.trc




直接搜索对象MONITOR.B:
Bucket: #=87975 Mutex=700000379478ec0(0, 5631, 0, 6)
  LibraryHandle:  Address=7000003406362e0 Hash=e8d557a7 LockMode=0 PinMode=0 LoadLockMode=0 Status=VALD
    ObjectName:  Name=MONITOR.B   FullHashValue=c81c887fb609499e2952a19ee8d557a7 Namespace=TABLE/PROCEDURE(01) Type=TABLE(02) Identifier=18379 OwnerIdn=35
    Statistics:  InvalidationCount=0 ExecutionCount=0 LoadCount=1 ActiveLocks=0 TotalLockCount=7 TotalPinCount=7
    Counters:  BrokenCount=1 RevocablePointer=1 KeepDependency=0 BucketInUse=3 HandleInUse=3 HandleReferenceCount=0
    Concurrency:  DependencyMutex=700000340636390(0, 5, 0, 0) Mutex=700000340636410(1298, 74, 0, 6)
    Flags=PIN/TIM/[00002801]
    WaitersLists:
      Lock=700000340636370[700000340636370,700000340636370]
      Pin=700000340636350[700000340636350,700000340636350]
      LoadLock=7000003406363c8[7000003406363c8,7000003406363c8]
    Timestamp:  Current=12-18-2013 16:44:01
    HandleReference:  Address=700000340636480 Handle=700000369523fe8 Flags=OWN[200]
    ReferenceList:
      Reference:  Address=700000339dca730 Handle=70000036b82f5a8 Flags=DEP[01]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=0
      Reference:  Address=700000352df4878 Handle=70000036b9f78d0 Flags=DEP[01]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=0
      Reference:  Address=70000034becb550 Handle=700000321fefd90 Flags=DEP[01]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=0
      Reference:  Address=700000327c7dd08 Handle=7000003477d14a8 Flags=DEP[01]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=0
      Reference:  Address=7000003417c4e50 Handle=70000035ee3f178 Flags=DEP[01]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=0
我们看到ReferenceList部分有5个依赖对象,这些对象就是注册在对象B上的依赖对象,我们4个SQL为什么是5个依赖对象,那是因为我的表没做分析,动态采样的语句也产生了一个CURSOR。
如果我们对表B做了DDL操作,再DUMP,会发现这些依赖对象都是无效了(查看FLAGS标志)
Bucket: #=87975 Mutex=700000379478ec0(0, 5648, 0, 6)
  LibraryHandle:  Address=7000003406362e0 Hash=e8d557a7 LockMode=0 PinMode=0 LoadLockMode=0 Status=VALD
    ObjectName:  Name=MONITOR.B   FullHashValue=c81c887fb609499e2952a19ee8d557a7 Namespace=TABLE/PROCEDURE(01) Type=TABLE(02) Identifier=18379 OwnerIdn=35
    Statistics:  InvalidationCount=0 ExecutionCount=0 LoadCount=3 ActiveLocks=0 TotalLockCount=17 TotalPinCount=18
    Counters:  BrokenCount=4 RevocablePointer=2 KeepDependency=0 BucketInUse=13 HandleInUse=13 HandleReferenceCount=0
    Concurrency:  DependencyMutex=700000340636390(0, 15, 0, 0) Mutex=700000340636410(1298, 172, 0, 6)
    Flags=PIN/TIM/[00000801]
    WaitersLists:
      Lock=700000340636370[700000340636370,700000340636370]
      Pin=700000340636350[700000340636350,700000340636350]
      LoadLock=7000003406363c8[7000003406363c8,7000003406363c8]
    Timestamp:  Current=12-18-2013 17:18:06
    HandleReference:  Address=700000340636480 Handle=700000369523fe8 Flags=OWN[200]
    ReferenceList:
      Reference:  Address=70000033f0e9d00 Handle=700000359c1d168 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=70000033d9e6080 Handle=70000035783b5d8 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=700000339dca730 Handle=70000036b82f5a8 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=700000352df4878 Handle=70000036b9f78d0 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=70000034becb550 Handle=700000321fefd90 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=700000327c7dd08 Handle=7000003477d14a8 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
      Reference:  Address=7000003417c4e50 Handle=70000035ee3f178 Flags=DEP/INV[05]
        Timestamp=12-18-2013 16:44:01 InvalidatedFrom=8
    ObjectFreed=last freed from PNDL addn data FUP


由于这种null类型的library cache lock可以被DDL等操作打破,因此被称为breakable parse lock,其实我自己不喜欢理解它是一种锁,本质是在其依赖对象上注册上他的信息,等依赖对象失效的时候,知道通知哪些对象失效。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-1220125/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22034023/viewspace-1220125/

内容概要:本文针对传统三电平并网逆变器在谐波抑制、电网不平衡工况适应性及动态响应方面的不足,提出以有源中点箝位(ANPC)三电平逆变器为核心,融合双极性倍频脉宽调制(DPWMA)、正负序分离相及电网电压前馈控制的一体化高性能并网控制策略。通过分析ANPC拓扑在开关损耗均衡、中点电位稳定和输出波形质量方面的硬件优势,结合DPWMA调制提升等效开关频率以降低谐波,利用正负序分离技术实现不平衡电网下的精准相,并引入电网电压前馈控制以克服传统闭环控制的滞后性,提升动态抗扰能力。通过仿真模型对稳态、电网不平衡和动态扰动工况进行验证,结果表明该复合控制策略能显著降低并网谐波、提升相精度与系统稳定性,适用于新能源并网等复杂应用场景。; 适合人群:具备电力电子与电力系统基础知识,从事新能源并网、逆变器控制、电能质量优化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 提升大功率并网逆变器在电网电压不平衡、畸变等复杂工况下的运行稳定性;② 优化并网电流波形质量,降低总谐波畸变率;③ 改善系统动态响应能力,应对电压骤升骤降等扰动;④ 为ANPC逆变器在新能源发电、工业变频等场景中的高性能控制提供仿真与设计参考。; 阅读建议:建议结合Simulink仿真模型,深入理解DPWMA调制实现、正负序分离相算法及前馈-反馈复合控制结构的设计逻辑,重点关注多策略协同作用下的性能提升机制,并通过复现实验验证不同工况下的控制效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值