• [每日一题] 11gOCP 1z0-052 :2013-09-25 Lock ――for update.................................C23


    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12021587

    正确答案:ABE

     

    这道题需要我们了解锁的知识点。

    TM锁的模式:

      0-None   --没有锁 select

      1-Null   --空锁

      2-SS(RS) --行级共享锁(Row Shared,简称RS锁)

                     通过lock table t10 in row sharemode;命令添加RS锁

      3-SX(RX) --行级排他锁(Row exclusive)RX锁

    进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁

           允许其他事务通过DML语句修改相同表里的其他数据行

           允许使用lock table t10 in row exclusive mode;命令对表添加RX锁定;

           不允许其他事务对表添加X锁

             通过select … from for update命令添加RX锁

    4-S --共享锁(Share,简称S锁)

             通过lock table t10 in share mode;命令添加该S锁(wait for ITL release)

    5-SSX(SRX) --共享行级排他锁(Share Row Exclusive,简称SRX锁)

           通过lock table t10 in share rowexclusive mode;命令添加SRX锁

    6-X --排他锁(Exclusive,简称X锁)

                    通过lock table t10 in exclusive mode命令添加X锁

    根据题意,我们开起一个会话执行以上的for update的语句会产生一个3号锁(在9i是号锁,10g及以上版本是3号锁)和6号锁。操作如下,观察锁。

    1、在125号会话下,执行select语句

    gyj@OCM> select sid from v$mystat where rownum=1;
    
           SID
    ----------
           125
    
    gyj@OCM> SELECT ename
      2  FROM emp
      3  WHERE job='CLERK'  FOR UPDATE OF empno;
    
    ENAME
    ----------
    SMITH
    ADAMS
    JAMES
    MILLER
    

    2、查125会话的锁信息

    gyj@OCM> select * from v$lock where sid=125;
    
    ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
    00000000910D8F58 00000000910D8FB0        125 TO      68064          1          3          0        273          0
    00000000910D91F8 00000000910D9250        125 AE        100          0          4          0        993          0
    00002B18F6AFC2E0 00002B18F6AFC340        125 TM      77522          0          3          0        145          0
    000000008FB4E7E0 000000008FB4E858        125 TX     196640       1474          6          0        105          0
    

     

    发现TM的3号锁,TX的6号锁。

     

    OK,我们对答案一一解析:

    答案A正确,会被阻塞。开另一个会话:22号会话,执行如下:

    gyj@OCM> select sid from v$mystat where rownum=1;
    
           SID
    ----------
            22
    
    gyj@OCM> LOCK TABLE emp IN SHARE MODE;
    

    被阻塞了,LOCK TABLE emp IN SHARE MODE;会产生4号锁

    gyj@OCM> select * from v$lock where sid in(125,22);
    
    ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
    00000000910D8F58 00000000910D8FB0        125 TO      68064          1          3          0        557          0
    00000000910D91F8 00000000910D9250        125 AE        100          0          4          0       1277          0
    00000000910DA0F0 00000000910DA148         22 AE        100          0          4          0        304          0
    00002B18F6AFD318 00002B18F6AFD378         22 TM      77522          0          0          4        107          0
    00002B18F6AFD318 00002B18F6AFD378        125 TM      77522          0          3          0        429          1
    000000008FB4E7E0 000000008FB4E858        125 TX     196640       1474          6          0        389          0
    

    答案B正确,会被阻塞。开另一个会话:17号会话,执行如下:

     

    gyj@OCM>  select sid from v$mystat where rownum=1;
    
           SID
    ----------
            17
    
    gyj@OCM> LOCK TABLE emp IN EXCLUSIVE MODE;
    

    被阻塞了,LOCK TABLE emp IN EXCLUSIVE MODE;会产生6号锁

    gyj@OCM> select * from v$lock where sid in(125,17);
    
    ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
    00000000910D8F58 00000000910D8FB0        125 TO      68064          1          3          0        726          0
    00000000910D91F8 00000000910D9250        125 AE        100          0          4          0       1446          0
    00000000910D99F0 00000000910D9A48         17 AE        100          0          4          0         91          0
    00002B18F6AFC2E0 00002B18F6AFC340         17 TM      77522          0          0          6         70          0
    00002B18F6AFC2E0 00002B18F6AFC340        125 TM      77522          0          3          0        598          1
    000000008FB4E7E0 000000008FB4E858        125 TX     196640       1474          6          0        558          0
    

    答案C不正确,不会被阻塞。开一另会话148号会话,操作如下:

    gyj@OCM>  select sid from v$mystat where rownum=1;
    
           SID
    ----------
           148
    
    gyj@OCM> UPDATE emp SET sal=sal*1.2 WHERE job='MANAGER';
    
    3 rows updated.
    

    没有被阻塞,可以更新,在同一个表中更新不同的行,锁不会有冲突。

    gyj@OCM> select * from v$lock where sid in(125,148);
    
    ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
    00000000910D8F58 00000000910D8FB0        125 TO      68064          1          3          0       1684          0
    00000000910D91F8 00000000910D9250        125 AE        100          0          4          0       2404          0
    00000000910D92D8 00000000910D9330        148 AE        100          0          4          0        265          0
    00002B18F6AFC2E0 00002B18F6AFC340        148 TM      77522          0          3          0        108          0
    00002B18F6AFC2E0 00002B18F6AFC340        125 TM      77522          0          3          0        121          0
    000000008FB01218 000000008FB01290        148 TX     327685       1488          6          0         65          0
    000000008FB4E7E0 000000008FB4E858        125 TX     131082       1475          6          0        121          0
    

    答案D不正确,不会被阻塞。与答案C一样的情况,这里就不再说了。

     

    答案E正确,会被阻塞。开另一会话 143号会话,执行如下

    gyj@OCM>  select sid from v$mystat where rownum=1;
    
           SID
    ----------
           143
    
    gyj@OCM> SELECT ename FROM emp WHERE job='CLERK' FOR UPDATE OF empno;
    

    被阻塞了,更新同一行,会有行锁的冲突。

    gyj@OCM> select * from v$lock where sid in(125,143);
    
    ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
    00000000910D8F58 00000000910D8FB0        125 TO      68064          1          3          0       2019          0
    00000000910D91F8 00000000910D9250        125 AE        100          0          4          0       2739          0
    00000000910D98F8 00000000910D9950        143 TX     131082       1475          0          6         82          0
    00000000910D9D70 00000000910D9DC8        143 AE        100          0          4          0        114          0
    00002B18F6AFD318 00002B18F6AFD378        125 TM      77522          0          3          0        456          0
    00002B18F6AFD318 00002B18F6AFD378        143 TM      77522          0          3          0         82          0
    000000008FB4E7E0 000000008FB4E858        125 TX     131082       1475          6          0        456          1
    

    锁的机制中有一个非常重要的概念:锁的兼容性,看下面这幅图:

    QQ:252803295

    技术交流QQ群:
    DSI&Core Search  Ⅰ 群:127149411(2000人技术群:未满)
    DSI&Core Search  Ⅱ 群:177089463(1000人技术群:未满)
    DSI&Core Search  Ⅲ 群:284596437(500人技术群:未满)
    DSI&Core Search  Ⅳ 群:192136702(500人技术群:未满)
    DSI&Core Search  Ⅴ 群:285030382(500人闲聊群:未满)

    MAIL:dbathink@hotmail.com

    BLOG: http://blog.csdn.net/guoyjoe

    WEIBO:http://weibo.com/guoyJoe0218

    ITPUB: http://www.itpub.net/space-uid-28460966.html

    OCM:   http://education.oracle.com/education/otn/YGuo.HTM 


  • 相关阅读:
    Oracle中创建视图
    SQL Server 2012 Express安装图解
    oracle学习笔记
    Oracle中视图的创建和处理方法
    DDL、DML和DCL的理解
    ROS学习--如何结合launch文件使用参数服务器
    stm32多块开发板can总线互联卡死问题
    ROS CAN总线设备接入(二)can总线数据提取和以ros topic形式发布
    ROS CAN总线设备接入(一)Linux动态库的显式调用
    ROS .so载入undefined reference to `dlopen'问题
  • 原文地址:https://www.cnblogs.com/riskyer/p/3339537.html
Copyright © 2020-2023  润新知