设为首页 收藏本站
查看: 634|回复: 0

[经验分享] 【转】Oracle TM锁 TX锁

[复制链接]

尚未签到

发表于 2016-7-22 09:25:50 | 显示全部楼层 |阅读模式
  转自RuleV5http://blog.csdn.net/rulev5/article/details/7054612
  
 
 
Oracle数据库的锁类型
 oracle官方文档里面关于锁的定义:Locks are mechanisms that prevent destructive interaction between transactions accessing the same resource—either user objects such as tables and rows or system objects not visible to users, such as shared data structures in memory and data dictionary rows.
这段话的大概意思是说锁的作用用来保护tables、rows、shared data structures in memory and data dictionary rows等在交互访问的时候不会被破坏。

        根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁TX锁,其中TM锁称为级锁,TX锁称为事务锁或行级锁。
       当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
        在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
DML锁分类表
 
  表1 Oracle的TM锁类型
  锁模式
  锁描述
  解释
  SQL操作
  0
  none
  
  1
  NULL
  空
  Select
  2
  SS(Row-S)
  行级共享锁,其他对象只能查询这些数据行
  Select for update、Lock for update、Lock row share
  3
  SX(Row-X)
  行级排它锁,在提交前不允许做DML操作
    Insert、Update、Delete、Lock row share
  4
  S(Share)
  共享锁
    Create index、Lock share
  5
  SSX(S/Row-X)
  共享行级排它锁
  Lock share row exclusive
  6
  X(Exclusive)
  排它锁
  Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
 
 
1.关于V$lock表和相关视图的说明
 
  Column
  Datatype
  Description
  ADDR
  RAW(4 | 8)
  Address of lock state object
  KADDR
  RAW(4 | 8)
  Address of lock
  SID
  NUMBER
  Identifier for session holding or acquiring the lock
  TYPE
  VARCHAR2(2)
  Type of user or system lock
  The locks on the user types are obtained by user applications. Any process that is    blocking others is likely to be holding one of these locks. The user type locks are:
  TM - DML enqueue   
  TX - Transaction enqueue
  UL - User supplied
  --我们主要关注TXTM两种类型的锁
  --UL锁用户自己定义的,一般很少会定义,基本不用关注
  --其它均为系统锁,会很快自动释放,不用关注
  ID1
  NUMBER
  Lock identifier #1 (depends on type)
  ID2
  NUMBER
  Lock identifier #2 (depends on type)
  ---当lock type 为TM时,id1为DML-locked object的object_id
  ---当lock type 为TX时,id1为usn+slot,而id2为seq。
  --当lock type为其它时,不用关注
  LMODE
  NUMBER
  Lock mode in which the session holds the lock:
  0 - none
  1 - null (NULL)
  2 - row-S (SS)
  3 - row-X (SX)
  4 - share (S)
  5 - S/Row-X (SSX)
  6 - exclusive (X)
  --大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资    源,即表示该会话被阻塞。
  --往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个 或几个TX锁,但他们的id1和id2是不同的,请注意
  REQUEST
  NUMBER
  Lock mode in which the process requests the lock:
  0 - none
  1 - null (NULL)
  2 - row-S (SS)
  3 - row-X (SX)
  4 - share (S)
  5 - S/Row-X (SSX)
  6 - exclusive (X)
 
--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
CTIME
NUMBER
Time since current mode was granted
BLOCK
NUMBER
The lock is blocking another lock
0, 'Not Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */

--该锁是否阻塞了另外一个锁

 
2.其它相关视图说明
 
  视图名
  描述
  主要字段说明
  v$session
  查询会话的信息和锁的信息。
  sid,serial#:表示会话信息。
  program:表示会话的应用程序信息。
  row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。
  lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.
  v$session_wait
  查询等待的会话信息。
  sid:表示持有锁的会话信息。
  Seconds_in_wait:表示等待持续的时间信息
  Event:表示会话等待的事件,锁等于enqueue
   
  dba_locks
  对v$lock的格式化视图。
  Session_id:和v$lock中的Sid对应。
  Lock_type:和v$lock中的type对应。
  Lock_ID1: 和v$lock中的ID1对应。
  Mode_held,mode_requested:和v$lock中
  的lmode,request相对应。
  v$locked_object
  只包含DML的锁信息,包括回滚段和会话信息。
  Xidusn,xidslot,xidsqn:表示回滚段信息。和
  v$transaction相关联。
  Object_id:表示被锁对象标识。
  Session_id:表示持有锁的会话信息。
  Locked_mode:表示会话等待的锁模式的信
  息,和v$lock中的lmode一致。
  
 
  1.查询数据库中的锁

select * from v$lock;
select * from v$lock where block=1;

2.查询被锁的对象

select * from v$locked_object;

3.查询阻塞

查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');

查阻塞别的会话锁
select * from v$lock where lmode>0 and type in ('TM','TX');

4.查询数据库正在等待锁的进程

select * from v$session where lockwait is not null;


5.查询会话之间锁等待的关系
 
  select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;
 
  6.查询锁等待事件
select * from v$session_wait where event='enqueue';
7.查找锁住的表和解锁
select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c 
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;
--通过SID, SERIAL解锁 
--
alter system kill session 'SID, SERIAL';

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247650-1-1.html 上篇帖子: (转)ORACLE SQL_TRACE的使用 下篇帖子: ORACLE 11g 自动内存管理(原创)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表