ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle:锁处理

2022-01-13 09:31:29  阅读:155  来源: 互联网

标签:处理 DML 阻塞 update 会话 TM 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仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
  当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。

 

标签:处理,DML,阻塞,update,会话,TM,Oracle
来源: https://www.cnblogs.com/yb-ken/p/15796271.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有