Oracle:锁处理

一:解决方案

--查询锁
 select t.SID,
        t.SERIAL#,
        t2.OBJECT_TYPE,
        t.USERNAME ORACLE_USER,
        t2.OBJECT_NAME,
        t.OSUSER,
        t.MACHINE,
        t3.SQL_TEXT
   from v$session t, v$locked_object t1, dba_objects t2, v$sql t3
  where t.SID = t1.SESSION_ID
    AND t1.OBJECT_ID = t2.OBJECT_ID
    AND t3.SQL_ID = t.SQL_ID;

--解锁(sid:2038    serial#:52937)
alter system kill session '2038,52937';

 有趣的一些视图:v$lock、v$locked_object、v$session、v$dba_objects、v$sql
 

二:锁机制

 DML、DDL和DCL含义

DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据。    
    DML包括:  
        SELECT        
        INSERT        
        UPDATE        
        DELETE    

DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象。    
    DDL包括:DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:        
        CREATE TABLE       
        ALTER TABLE        
        DROP TABLE       
        CREATE INDEX        
        DROP INDEX

DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。
    DCL包括:
        ALTER PASSWORD 
        GRANT 
        REVOKE 
        CREATE SYNONYM

1、Oracle数据库的锁类型

  根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
  1)DML锁:目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
   4个常见的dml语句会产生阻塞:INSERT、UPDATE、DELETE、SELECT…FOR UPDATE。(Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行;UPDATE 、DELETE当执行操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚;Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.)

2、悲观封锁和乐观封锁
(1)悲观封锁
  锁在用户修改之前就发挥作用:Select ..for update(nowait)、Select * from tab1 for update。
  用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
  如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
  1):对返回结果集进行update或delete操作会发生阻塞。
  2):对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
  原因分析:
    此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的    
  释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级
  锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
(2)乐观封锁
  乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。
 

 

 

 

 

 

                           底线 


                      

你可能感兴趣的:(Oracle)