ORACLE深入 第五章 Locking and Latching

2023-11-09

ORACLE深入 第五章 Locking and Latching
Locks
            在单用户系统,LOCKS是不需要的。在多用户系统,为了让多用户访问数据,修改数据,修改数据结构,就需要一个机制来保证大家的一致性修改。该用LOCK的时候就用LOCKLOCKS是一种为了让你正常使用DB的工具,所以并不需要避免它(当然低劣的设计造成的不必要的LOCK应该避免,同时注意在你需要的时候保持LOCK,不需要的时候释放)。在row-Level lockLOCK并不会消耗很多资源,因为你LOCK 1 ROW1W ROWLOCK所需要用的资源都是一样的。READ动作不会被WRITE动作所BLOCKWRITE动作也不会被READ动作所BLOCK
流程类似于
    A:发现你要操作的那行数据的地址。
    B:去这行。
      Clock这行(如果这行已经lock了则等待其释放,除非你用nowait选项)
管理起来非常简单,那是因为lock做为DATA的属性进行管理。
 
Lock Types
  • DML locks: DML语句产,比如SELECTINSERTUPDATEMERGEDELETE。保证一行只有一个用户操作,并且其他用户不能修改你做操作的表的结构。
DML LOCKS又细分为以下类型
    1. TXTransactionLocks
TX lock是开始于一个transaction的第一次改变(关于transaction请看SELECT FOR UPDATE 相关的知识 http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!318.entry),结束于DCL语句。采用一种queue方式以便其他session等待本transaction结束。比如SELECT FOR  UPDATE就会产生一个TX locks,
(DBMS_LOCK包测试ORACLE LOCK
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!590.entry)
    1. TM (DML Enqueue) Locks
            一般提示ORA-00054: resource busy and acquire with NOWAIT specified
我们也可以用ALTER TABLE TABLENAME DISABLE TABLE LOCK来取消TM锁,这样我们就无法DROP此表了。
SQL> create table t1 ( x int );
Table created.
SQL> create table t2 ( x int );
Table created.
SQL> insert into t1 values ( 1 );
1 row created.
SQL> insert into t2 values ( 1 );
1 row created.
1  select (select username
 from v$session
   where sid = v$lock.sid) username,
   sid,
   id1,
   id2,
   lmode,
   request, block, v$lock.type
   from v$lock
    where sid = (select sid
    from v$mystat
   where rownum=1)
SQL> /
USERNAME                                                            SID
------------------------------------------------------------ ----------
       ID1        ID2      LMODE    REQUEST      BLOCK TYPE
---------- ---------- ---------- ---------- ---------- ----
SBTOPT                                                               23
     13444          0          3          0          0 TM
SBTOPT                                                               23
     13445          0          3          0          0 TM
SBTOPT                                                               23
    327743      68571          6          0          0 TX
SQL> select object_name, object_id
  2  from user_objects
  3  where object_name in ('T1','T2')
  4  /
OBJECT_NAME                 OBJECT_ID
------------------------------------------------------------------------
T2                         13445
T1                       13444
      一个TRANSACTION只能有一个TX LOCK,可以有多个TM LOCK,也可以看到TM LOCKID1OBJECT_IDTM LOCKS的数量由DML_LOCKS决定。
在有TM LOCK的情况下,我们DROP TABLE T1会发生什么呢
SQL> drop table t1
  2  /
Table dropped.
      表为什么被删除了呢?
     因为DROPDDL语句,在DDL语句前和后都会触发COMMIT而不管DDL语句执行成功否。那让我们再接着看DDL LOCKS
  • DDL locks
    1. Exclusive DDL locks:
      防止其他SESSION获得DDL LOCKTM LOCK
    1. Share DDL locks
      其他SESSION不能修改表结构,但是可以修改数据
    1. Breakable parse locks:
      不会阻止DDL语句
  • Internal locks latches,保护内部数据结构,当ORACLE parse一个query,然后产生一个optimized query plan,它就会latch一块library cache来存放plan以便让其他session也可以用。(可能有人不同意把latch归到LOCK里,求同存异吧),PMON负责清理dies latch
LATCH按如下流程获得
Attempt to get Latch
If Latch gotten
Then
     return SUCCESS
Else
     Misses on that Latch = Misses+1;
     Loop
          Sleeps on Latch = Sleeps + 1
             For I in 1 .. 2000
             Loop
                   Attempt to get Latch
                   If Latch gotten
                   Then
                      Return SUCCESS
                   End if
              End loop
          Go to sleep for short period
     End loop
End if
      如果没有得到LATCH,则会LOOP一定数量(2000),在LOOP的过程中如果成功,则返回并继续运行程序,如果没有成功,则SLEEP一定时间再LOOPLATCH持有的时间不会很长,但是发生阻塞后试图获得LATCH的过程会消耗CPU的,会使系统看起来很BUSY 
                                    CPU Usage Comparison With and Without Bind Variables
                                                                                                 |           Waits for Latches
            | CPU Seconds/Elapsed      |Shared Pool Latch         |(Number of Waits/Time
Users  |            Time in Minutes    | Requests                       |  in Wait in Seconds)
            |    No Binds        Binds        |  No Binds            Binds|          No Binds        Binds
1        26/0.52          4/0.10       563,883           25,232      0/0
2        74/0.78         11/0.20      1,126,006          50,367    406/1
3        155/1.13       29/0.37       1,712,280          75,541     2,830/4
4        272/1.50        44/0.45      2,298,179          100,682    9,400/5
5        370/2.03        64/0.62      2,920,219          125,933  13,800/20
6        466/2.58        74/0.72       3,526,704          150,957   30,800/80   17/0
7        564/3.15        95/0.92     4,172,492          176,085  40,800/154
8        664/3.57        106/1.00    4,734,793          201,351  56,300/240 120/1
9        747/4.05       117/1.15    5,360,188          230,516  74,600/374 230/1
10      822/4.42       137/1.30    5,901,981          251,43      60,000/450          354/1
可以看到是否BINDLATCH有很大影响
手工LOCK和用户自定义LOCK
                在前面我们明白,当我们UPDATE的时候,获得一个TM LOCK来防止其他SESSION DROP TABLEDDL);获得一个TX LOCK来表示那些数据是我们OWN的;DDL LOCK用来在我们自己改变OBJECT的时候保护OBJECTS不被其他人改变,那我们如何主动利用LOCK呢?
            SELECT...FOR UPDATE是最常用的一种,通常用来实现某种商业规则(SELECT FOR UPDATE 相关的知识
       LOCK TABLE IN EXCLUSIVE MODE,用在你需要大批量做更新,而又不希望别人BLOCK.
       用户自定义的LOCK请参考DBMS_LOCK包测试ORACLE LOCK
 
TX locks: These locks are acquired for the duration of a data-modifying transaction.
TM and DDL locks: These locks ensure that the structure of an object is not altered
while you are modifying its contents (TM lock) or the object itself (DDL lock).
Latches: These are internal locks that Oracle employs to mediate access to its shared
data structures.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORACLE深入 第五章 Locking and Latching 的相关文章

  • 在读取之前设置未定义的 javascript 属性

    var tr tr SomeThing SomeThingElse console log tr SomeThing SomeThingElse console log tr Other undefined tr get function
  • 在 Oracle BI Publisher 中将数字转换为单词

    我有一个要求 我需要将发票总金额显示为 rtf 中的文字 我尝试过 but it doesn t show any thing Is there any RTF Tag to do such a requirement on layout
  • Java中的String为什么是不可变的对象,但我在创建一个对象后仍然可以更改它的值? [复制]

    这个问题在这里已经有答案了 如果我可以创建一个字符串并给它一个值 这怎么可能呢 然后 我可以像这样简单地覆盖它的值 String a abc a def 我怎么可能改变的值a 我一定在这里遗漏了一些东西 我知道每当创建 String 对象时
  • 为什么.NET中的每个类都继承自Object?

    我不明白 为什么他们需要一个共同的基础 这个问题预设了一个谎言 他们不need一个共同的基础类型 这个选择并不是出于必要 这是出于为客户提供最佳价值的愿望 当设计类型系统或任何其他相关问题时 有时您会遇到决策点 您必须决定 X 或非 X 公
  • 具有多个数据源的 Tomcat 6/7 JNDI

    当有多个时
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • 通过一个表中的列更新另一表中的列

    我有两张桌子 A 和 B 两者都有一个共同的列 name 并通过列 id 相互链接 表A中的 name 列是空的 而表B中有数据 我的任务是用相应的id填充从表B到表A的该列中的所有数据 我正在使用以下查询 UPDATE A SET A n
  • SQL选择符号||是什么意思意思是?

    什么是 在 SQL 中做什么 SELECT a b AS letter 表示字符串连接 不幸的是 字符串连接不能在所有 sql 方言之间完全移植 ANSI SQL 中缀运算符 mysql concat 可变参数函数 caution 表示 逻
  • 在 Oracle 临时表上放置索引安全吗?

    我读过 不应分析临时表 因为它会破坏其他表的统计信息 指数怎么样 如果我在程序运行期间在表上放置索引 使用该表的其他程序会受到该索引的影响吗 索引是否会影响我的进程以及使用该表的所有其他进程 或者它会单独影响我的过程吗 所有的回复都不是权威
  • 从 oracle 中为每个组选择最新行

    我在留言簿中有一张包含用户评论的表格 列有 id user id 标题 评论 时间戳 我需要为每个用户选择最新行 我尝试使用 group by 执行此操作 但没有管理它 因为我无法在按 user id 分组的同一查询中选择任何其他内容 SE
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 序列化对于对象大小估计可靠吗?

    我使用序列化来估计对象使用的内存量 我已经读过this https stackoverflow com questions 426396 how much memory does a c net object use and this ht
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 如何在sql中提取周数

    我有一个 varchar2 类型的转换列 其中包含以下主菜 01 02 2012 01 03 2012 etc 我使用 to date 函数将其转换为另一列中的日期格式 这是我得到的格式 01 JAN 2012 03 APR 2012 当我
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 如何动态创建新属性

    如何从对象方法内的给定参数创建属性 class Foo public function createProperty var name val here how can I create a property named var name
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 在 Ruby 中跨多个类实例记忆数据的好方法是什么?

    考虑 生成数据的对象的许多实例 如果每次运行只生成一次该数据 那就太好了 class HighOfNPeriods lt Indicator def generate data indicator data DataStream new 0
  • sqlldr.exe 不适用于 Windows 10

    我最近通过自定义安装安装了 Oracle 数据库客户端 12 1 0 2 0 winx64 并仅选择包括 SQL Loader 等在内的数据库实用程序 但是当我尝试执行 sqlldr exe 时 出现以下错误 在网上搜索后 我从所有站点 即
  • 在Oracle中查找不包含数字数据的行

    我试图在一个非常大的 Oracle 表中找到一些有问题的记录 即使该列是 varchar2 列 也应包含所有数值数据 我需要找到不包含数字数据的记录 当我尝试在此列上调用 to number col name 函数时 它会抛出错误 我想你可

随机推荐