• ORACLE【2】:锁机制及解锁


    1. 锁的基本知识

    根据要保护的对象不同,oracle的数据锁可以分成以下几类:DML锁,(data locks)数据锁,用于保护数据的完整性;DDL锁(dictionary locks),用于保护数据库内部结构,如表,索引等结构定义;内部锁和闩(internal locks and latcheds),保护数据库内部结构。

    我们通常遇到的都是DML锁,DML锁在通常状态下都是用于保证并发情况下的数据完整性。在oracle中,主要包含有TM锁和TX锁,其中TM锁称为表级锁,TX锁称行级锁或事物锁。当oracle执行DML语句时,会自动在表上获取TM锁,TM锁获取之后,再自动获取TX锁,并将实际锁定的数据行的锁标志位进行置位,这样事务监察相容性时就不必逐行检查了,大大提高了效率。

    那锁等待是如何出现的呢?

    在数据行上只有X锁(排他锁),在oracle数据库中,当事物发起一个DML语句时就获取了一个TX锁,并保持到执行完毕或回滚。当多个会话在表的同一记录执行DML时,第一条会将记录加锁,其他会话等待。如发生了死锁,将会在oracle日志(alertSID.log)中看到ORA-60错误。

    2. 悲观锁与乐观锁

    悲观锁与乐观锁的区别在于悲观锁认为数据更新时一定会发生冲突,因此需要对记录加锁,以保证数据的一致性。oracle在数据更新时通常时候的是悲观锁,因其为行级锁,具有较好的性能,通常针对并发使用。

    乐观锁与其不同,它认为数据不存在冲突,因此,需要在提交时保证数据一致性,如果不一致,则返回错误,由程序本身的逻辑进行处理。

    乐观锁的实现主要有三种方式:

    a. 通过比较提交前后的数据是否发生变化来判断是否存在数据冲突

    b. 通过在表中增加版本戳列,来标示是否发生了变化

    c. 通过比对表的时间戳来判断是否出现了版本变化

    可以通过trigger或存储过程实现该乐观锁。

    3.锁相关的视图

    v$lock

    v$lock
    
    SID          会话的sid,可以和v$session 关联     
    TYPE         区分该锁保护对象的类型,如tm,tx,rt,mr等  
    ID1          锁表示1,详细见下说明                  
    ID2          锁表示2,详细见下说明             
    LMODE        锁模式,见下面说明               
    REQUEST      申请的锁模式,同lmode                   
    CTIME        已持有或者等待锁的时间                  
    BLOCK        是否阻塞其他会话锁申请 1:阻塞 0:不阻塞 

    LMODE取值0,1,2,3,4,5,6, 数字越大锁级别越高, 影响的操作越多。  

    1级锁:  Select,有时会在v$locked_object出现。  

    2级锁即RS锁,相应的sql有:Select for update ,Lock xxx in  Row Share mode,select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独  占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。  

    3级锁即RX锁,相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。  

    4级锁即S锁,相应的sql有:Create Index, Lock xxx in Share mode  

    5级锁即SRX锁,相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update/delete ... ; 可能会产生4,5的锁。  

    6级锁即X锁,相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive mode  

    ID1,ID2的取值含义根据type的取值而有所不同  

    对于TM 锁,ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0  

    对于TX 锁,ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:  0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER  

    ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数 

     v$locked_objects

    v$locked_object  
    
    XIDUSN               undo segment number , 可以和v$transaction关联      
    XIDSLOT              undo slot number        
    XIDSQN               序列号                           
    OBJECT_ID            被锁定对象的object_id ,   可以和dba_objects关联  
    SESSION_ID           持有该锁的session_id,     可以和v$session关联  
    ORACLE_USERNAME      持有该锁的oracle帐号                       
    OS_USER_NAME         持有该锁的操作系统帐号                        
    PROCESS              操作系统的进程号,可以和v$process关联        
    LOCKED_MODE          锁模式,含义同v$lock.lmode  
      
    Dba_locks 和v$lock 内容差不多,略  
      
    V$session           如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息  
    ROW_WAIT_FILE#      等待的行所在的文件号  
    ROW_WAIT_OBJ#       等待的行所属的object_id  
    ROW_WAIT_BLOCK#     等待的行所属的block  
    ROW_WAIT_ROW#       等待的行在blcok中的位置
    

      

    4. oracle中锁的检测及解锁

    --查看被锁的表
    SELECT 
      p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
    FROM 
      v$process p, v$session a, v$locked_object b, all_objects c
    WHERE 
      p.addr = a.paddr 
    AND 
      a.process = b.process
    AND 
      c.object_id = b.object_id;
           
    --查看锁表的进程
    select 
      b.sid,b.serial#
    from 
      v$locked_object a,v$session b
    where 
      a.session_id = b.sid 
    group by 
      b.sid,b.serial#;
    
    --单个删除锁表的进程
    alter system kill session '36,32435'
    
    --批量删除锁表的进程
    declare cursor 
        mycur 
    is
    select 
        b.sid,b.serial#
    from 
        v$locked_object a,v$session b
    where 
        a.session_id = b.sid 
    group by 
        b.sid,b.serial#;
    begin
      for cur in mycur
        loop
          execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');
        end loop;
    end;
    

      

      

  • 相关阅读:
    (转帖) oracle是否归档模式及修改模式
    (转帖) Oracle实例恢复(Oracle instance recovery)
    实习第一周总结
    UML类图几种关系的总结
    表格排序
    利用js查找页面中的内链,外链
    事件机制(事件冒泡与事件捕获)
    谈 CSS 模块化
    初学后台框架总结篇二——快速了解CI框架
    初学后台框架总结篇一——学习过程
  • 原文地址:https://www.cnblogs.com/jiyuqi/p/3701716.html
Copyright © 2020-2023  润新知