oracle锁一些知识

表级锁共具有五种模式,如下所示。

行级排他锁(Row Exclusive,简称RX锁)

当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。

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

通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。

共享锁(Share,简称S锁)

通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。

排他锁(Exclusive,简称X锁)

通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。

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

通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

这五种模式的TM锁的兼容关系如下表所示(√表示互相兼容的请求;×表示互相不兼容的请求;N/A表示没有锁定请求):

Java代码  

  1. -   S   X   RS  RX  SRX N/A
  2. S   √   ×   √   ×   ×   √
  3. X   ×   ×   ×   ×   ×   √
  4. RS  √   ×   √   √   √   √
  5. RX  ×   ×   √   √   ×   √
  6. SRX ×   ×   √   ×   ×   √
  7. N/A √   √   √   √   √   √

从前面的描述中可以看到,我们不仅可以通过发出DML语句的方式,由Oracle自动在表级别上添加TM锁。我们还可以通过发出lock table命令主动地在表级别上添加TM锁,并在该命令中可以指定不同的锁定模式,其命令格式如下所示:

Java代码  

  1. lock table  in [row share][row exclusive]
  2. [share][share row exclusive][exclusive] mode;

对Oracle数据库中的各SQL语句所产生的表级锁的情况进行汇总,如下表所示:

Java代码  

  1. SQL语句   表锁定模    允许的表锁定模式
  2. Select * from ……    RS  RS、RX、S、SRX、X
  3. Insert into ……  RX  RS、RX
  4. Update ……   RX  RS、RX
  5. Delete from ……  RX  RS、RX
  6. Select * from for update    RS  RS、RX、S、SRX
  7. lock table in row share mode    RS  RS、RX、S、SRX
  8. lock table in row exclusive mode    RX  RS、RX
  9. lock table in share mode    S   RS、S
  10. lock table in share row exclusive mode  SRX RS
  11. lock table in exclusive mode    X   RS

对于通过lock table命令主动添加的锁定来说,如果要释放它们,只需要发出rollback命令即可。

Oracle数据库的锁类型 
    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。 
    DML锁的目的在于保证并发情况下的数据完整性,本文主要讨论DML锁。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 
    当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。 
    在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。 
    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。 
   TX锁等待的分析 
    在介绍了有关地Oracle数据库锁的种类后,下面讨论如何有效地监控和解决锁等待现象,及在产生死锁时如何定位死锁的原因。 
    监控锁的相关视图 数据字典是Oracle数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。和锁相关的数据字典视图如表2所示。 
    TX锁等待的监控和解决在日常工作中,如果发现在执行某条SQL时数据库长时间没有响应,很可能是产生了TX锁等待的现象。为解决这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中断事务。 
    死锁的监控和解决在数据库中,当两个或多个会话请求同一个资源时会产生死锁的现象。死锁的常见类型是行级锁死锁和页级锁死锁,Oracle数据库中一般使用行级锁。下面主要讨论行级锁的死锁现象。 
    当Oracle检测到死锁产生时,中断并回滚死锁相关语句的执行,报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。 
    在日常工作中,如果发现在日志文件中记录了ora-00060的错误信息,则表明产生了死锁。这时需要找到对应的跟踪文件,根据跟踪文件的信息定位产生的原因。 
   如果查询结果表明,死锁是由于bitmap索引引起的,将IND_T_PRODUCT_HIS_STATE索引改为normal索引后,即可解决死锁的问题。

Java代码  

  1. 表1 Oracle的TM锁类型
  2. 锁模式 锁描述 解释  SQL操作
  3. 0   none
  4. 1   NULL    空   Select
  5. 2   SS(Row-S)   行级共享锁,其他对象只能查询这些数据行
  6. Select for update、Lock for update、Lock row share
  7. 3   SX(Row-X)   行级排它锁,在提交前不允许做DML操作
  8. Insert、Update、Delete、Lock row share
  9. 4   S(Share)    共享锁 Create index、Lock share
  10. 5   SSX(S/Row-X)    共享行级排它锁 Lock share row exclusive
  11. 6   X(Exclusive)    排它锁
  12. Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

Java代码  

  1. 表2 数据字典视图说明
  2. 视图名 描述  主要字段说明
  3. v$session   查询会话的信息和锁的信息。
  4. sid,serial#:表示会话信息。
  5. program:表示会话的应用程序信息。
  6. row_wait_obj#:表示等待的对象。和dba_objects中的object_id相对应。
  7. v$session_wait 查询等待的会话信息。
  8. sid:表示持有锁的会话信息。
  9. Seconds_in_wait:表示等待持续的时间信息
  10. Event:表示会话等待的事件。
  11. v$lock 列出系统中的所有的锁。
  12. Sid:表示持有锁的会话信息。
  13. Type:表示锁的类型。值包括TM和TX等。
  14. ID1:表示锁的对象标识。
  15. lmode,request:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。
  16. dba_locks 对v$lock的格式化视图。
  17. Session_id:和v$lock中的Sid对应。
  18. Lock_type:和v$lock中的type对应。
  19. Lock_ID1: 和v$lock中的ID1对应。
  20. Mode_held,mode_requested:和v$lock中
  21. 的lmode,request相对应。
  22. v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。
  23. Xidusn,xidslot,xidsqn:表示回滚段信息。和
  24. v$transaction相关联。
  25. Object_id:表示被锁对象标识。
  26. Session_id:表示持有锁的会话信息。
  27. Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。

===================================================================== 
按锁保护的内容分类 
oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为 
a:dml锁, data locks 数据锁,用来保护数据的完整性和一致性 
b:ddl锁, dictionary locks 字典锁,用来保护数据对象的结构,如table,index的定义 
c:内部锁和闩 internal locks and latchs 用来保护数据库内部结构,如sga内存结构

dml锁 
DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。当Oracle执行delete,update,insert,select for update  DML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位(lb 即lock bytes)进行置位。在记录被某一会话锁定后,其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。

在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。在数据行上只有X锁(排他锁),就是说TX锁只能是排他锁,在记录行上设置共享锁没有意义。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。

这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。

和锁相关的性能视图介绍

Java代码  

  1. v$lock
  2. SID          会话的sid,可以和v$session 关联
  3. TYPE         区分该锁保护对象的类型,如tm,tx,rt,mr等
  4. ID1          锁表示1,详细见下说明
  5. ID2          锁表示2,详细见下说明
  6. LMODE        锁模式,见下面说明
  7. REQUEST      申请的锁模式,同lmode
  8. CTIME        已持有或者等待锁的时间
  9. BLOCK        是否阻塞其他会话锁申请 1:阻塞 0:不阻塞
  10. LMODE取值0,1,2,3,4,5,6, 数字越大锁级别越高, 影响的操作越多。
  11. 1级锁:
  12. Select,有时会在v$locked_object出现。
  13. 2级锁即RS锁
  14. 相应的sql有:Select for update ,Lock xxx in  Row Share mode,select for update当对
  15. 话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独
  16. 占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update
  17. 操作。
  18. 3级锁即RX锁
  19. 相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit
  20. 之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们
  21. 必须释放掉上一个才能继续工作。
  22. 4级锁即S锁
  23. 相应的sql有:Create Index, Lock xxx in Share mode
  24. 5级锁即SRX锁
  25. 相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update
  26. /delete ... ; 可能会产生4,5的锁。
  27. 6级锁即X锁
  28. 相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive
  29. mode
  30. ID1,ID2的取值含义根据type的取值而有所不同
  31. 对于TM 锁
  32. ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0
  33. 对于TX 锁
  34. ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:
  35. 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
  36. ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数

Java代码  

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

手工释放锁

Java代码  

    1. alter system kill session ‘sid,serial#‘;
时间: 2024-11-04 21:01:07

oracle锁一些知识的相关文章

【锁】Oracle锁系列

[锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 锁的概念.分类.及其模拟 ② 查询锁的视图及视图之间的关联 ③ 锁的参数(DML_LOCKS.DDL_LOCK_TIMEOUT) ④ FOR UPDATE及FOR UPDATE OF系列 ⑤ 带ONLINE和不带ONLINE创建索引的锁情况(是否阻塞DML操作) ⑥ 包或存过不能编译的解决方法

oracle 锁

问题如下: SQL> conn scott/[email protected]_databaseConnected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0Connected as scott ...... SQL> drop table student2; drop table student2 ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效================

oracle 锁表 及 解锁

很久没有写博客了.不知道写什么 今天,让我清一张表的数据,结果清了之后,系统直接不动了,就好像服务器挂死了一样. 后来找了半天才发现,原来是我删除数据之后没有提交事物造成了数据库锁表,然后又不明白了, 什么是锁表呢,于是就上网去查 查了半天,大多数都是说怎么解决锁表和查询锁表的,但是只了解方法还不够,又想知道原理,于是 就继续往深里查查到了oracle的锁机制 由于数据库是多用户同时使用的共享资源,当多个用户并发的存取事物的时候,数据库中就会发生多个进程 同时操作同一个数据的情况,若对并发操作不

Oracle锁表查询和解锁方法

数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remove DQL:数据库查询语言,关键字:select oracle表在什么情况下会被锁住 DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL

查询Oracle锁表和解决方法

Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;select * from v$locked_object;(2)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_obj

Oracle锁总结

<oracle的锁> 在数据库中必须要了解的几点: 1.事务是数据库的核心,他们是好东西 2.应该延迟到适当的时刻才提交.不要太快提交,以避免对系统带来压力,这是因为,即使事务很长或很大,也一般不会对系统造成压力.相应的原则是:    在必要时才提交,不要提前.事务的大小只应该根据业务逻辑来定. 3.只要需要,就应该尽可能长时间的保持对数据所加的锁.这些锁是你能用的工具,而不是让你退避三舍,锁并不是什么稀有资源,恰恰相反,只要需要,    你就应该长期的保持数据上的锁.锁并不稀少,而且他们可以

oracle 锁的介绍 (转)

本文转自:http://blog.csdn.net/gyb2013/article/details/6929697 一.什么是锁: Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部.这个是通过ITL来实现的,一个事务要修改块中的数据,必须获得该块中的一个itl.关于itl(事务槽)的介绍可参考http://blog.csdn.net/gybyylx/article/details/6893639. 说明:在orac

Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行          ----使用 commit 或 rollback 命令释放锁 ----Oracle 通过使用 INSERT.UPDATE 和 SELECT-FOR UPDATE 语句自动获取行级锁 SELECT-FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其他用户更新该行 ―可以执行除更新之外的其他操作 ―select * from goods whe

oracle锁表

Oracle锁表比较简单,查询锁表的session杀掉就可以了. 1.以下几个为相关表 SELECT * FROM V$LOCK; SELECT * FROM V$SQLAREA; SELECT * FROM V$SESSION; SELECT * FROM V$PROCESS; SELECT * FROM V$LOCKED_OBJECT; SELECT * FROM ALL_OBJECTS; SELECT * FROM V$SESSION_WAIT; 2.查看被锁的表 SELECT B.OWN