您当前的位置:首页 > 电脑百科 > 数据库 > Oracle

Oracle中的锁相关视图介绍(TX、TM)

时间:2022-06-01 12:48:46  来源:  作者:葫芦儿的成长记录

oracle中锁的分类:

enqueues---队列类型的锁,通常和业务相关的通常dml操作导致,数据写入

latches--系统资源方面的锁,防止资源争用,比如内存结构,sql解析等。

比如需要访问某个资源,但是如果要访问这个资源需要拿到数据库某个资源的授权,而这个资源的授权可以理解为latch。

锁的原则:

  1. 只有被修改时,行才会被锁定
  2. 当一条语句修改了一条记录,只有这条记录上被锁定,oracle数据库不存在锁升级(行级锁升级为表级锁 不存在)
  3. 当某行被修改的时候,他将阻塞别人对他的修改
  4. 当一个事务修改一行时,将在这个行上加上行锁TX,用于阻止其他事务对相同行的修改
  5. 读永远不会阻止写,但有一个例外 select for update
  6. 写永远不会阻塞读
  7. 当一行被修改后,oracle通过回滚段提供一致性读。

常见的锁

最常见的已知资源类型是TM、TX和UL资源:

  • TM资源(称为DML排队)是在引用表的语句执行期间获取的,以便在执行期间不会删除或更改表。
  • TX 锁是在事务启动其第一个更改时获取的,并一直保留到事务执行 COMMIT 或 ROLLBACK 为止。它主要用作排队机制,以便其他会话可以等待事务完成。TX 锁的锁名称(ID1 和 ID2)反映了活动事务的事务 ID。
  • UL资源表示由DBMSLOCK包定义的用户自定义的锁

注意:TX 锁是一个应用程序编码、设计和使用问题,只能通过使用更频繁和显式的 COMMIT 语句和任何其他次要代码更改来更改应用程序代码来修复。Oracle 支持部门无法修复 TX 锁定等待问题,只能帮助识别导致等待的对象和命令。请与开发人员合作修复代码并缓解 TX 锁定等待。

TM就是DML锁,是表级上的锁。TX是事务锁,是行级锁。在执行DML操作时,先对表加TM锁,如果加锁成功,然后再加TX锁。一般情况下,一个会话中,只会出现一个TX锁,可能有多个TM锁,这些TM所共享一个TX锁。不同的语句加TM锁的类型不同,类型就是下面说的LOCK MODE。在表级上加了TM锁也是为了防止其他会话再在表上加上排它锁(例如对表执行DDL语句)。一个表上可以加上多个TM锁、TX锁的

常用视图学习锁

  • v$transaction视图
第一个视图是v$transaction,就是Oracle数据库所有活动的事务数,所有活动的事务每一个活动的事务在这里有一行。
v$transaction
XIDUSN表示当前事务使用的回滚段的编号
XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)
XIDSQN说明序列号,即该槽(slot)被重用的次数
STATUS说明该事务是否为活动的
  • 实验:
LUQX@oradb>delete from t;
2 rows deleted.
select xidusn,xidslot,xidsqn,status from v$transaction;
Oracle中的锁相关视图介绍(TX、TM)

 

XIDUSN:事务使用的回滚段编号
XIDSLOT:使用哪个槽位
XIDSQN: 即该槽(slot)被重用的次数
这三个唯一标识一个事务的编号。
status为active标识事务状态
  • v$lock视图
v$lock 记录了session已经获得的锁定以及正在请求的锁定的信息
SID说明session的ID号
TYPE说明锁的类型,主要关注TX和TM TM表示表锁或DML锁,TX表示行锁或事务锁
Oracle执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM锁获得后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。
TM 锁包括了SS 、 SX、 S 、X 等多种模式,在数据库中用 0 -6 来表示
LMODE说明已经获得的锁定的模式,以数字编码表示
REQUEST说明正在请求的锁定的模式,以数字编码表示
BLOCK说明是否阻止了其他用户获得锁定,大于0说明是,等于0说明否
表级锁TM和事务锁TX。
对TM来讲ID1是哪个对象,
对于TX来讲ID1和ID2用来标识事务的和回滚段信息,标识事务信息。
ID1对应视图V$TRANSACTION中的XIDUSN字段(Undo segment number:事务对应的撤销段序列号)和XIDSLOT字段(Slot number:事务对应的槽位号)。
其中ID1的高16位为XIDUSN,低16位为XIDSLOT。
ID2对应视图V$TRANSACTION中的XIDSQN字段(Sequence number:事务对应的序列号)以十进制数值表示环绕(wrap)次数,即该槽(slot)被重用的次数;

LMODE有如下几种,针对TM锁

          0 =None;
          1=Null ;
          2=Row-S (SS,行级共享锁,其他SQL语句只能查询这些数据行),sql操作有select for update、lock for update、lock row share;
          3=Row-X (SX,行级排它锁,在提交前不允许做DML操作),sql操作有insert、update、delete、lock row share;
          4=Share(共享锁),sql操作有create index、lock share;
          5=S/Row-X (SSX,共享行级排它锁),sql操作有lock share row exclusive;
          6=Exclusive(排它锁),alter table、drop table、drop index、truncate table、look exclusive等DDL

不同级别锁之间的兼容矩阵

Oracle中的锁相关视图介绍(TX、TM)

 

可以看出从下往上排他性越来越强,如果对表加6级锁那么此时此表不能加锁操作

  • 实验

模拟两个会话执行delete操作
会话1 sid144 执行delete from t;不提交
会话2 sid20 再次执行delete from t;语句的时候会处于卡住状态。
新建会话查看此时数据块的lock状态。分析以下各个值的情况。


查看当前系统锁状态
select sid,
type,
id1,
id2,
decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,
decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,
block    from v$lock   
 where type in ('TX','TM') order by 1,2;
Oracle中的锁相关视图介绍(TX、TM)

 

图上可以看出sid20及sid144两个会话分别再表上面添加了TM及TX锁。两个会话TM类型的锁的ID1对应的ID为锁对象的object_id,可以通过dba_objects视图查看对应的对象名称。两个会话TX类型的锁对应的ID1和ID2的值一样,是由于144会话阻塞了20会话导致的,正常来说两个事务的id1和id2是不同的。图上可以看出144持有lock_mode为exclusive-6级锁。通过block字段值为1(表示有会话被阻塞),会话20并未持有任何tx锁,而是再请求一个6级锁。所以总上看出是由于144会话阻塞了20会话。

那么ID1和ID2如何转换为回滚段相关信息呢如下步骤演示

SYS@oradb>select xidusn,xidslot,xidsqn,status from v$transaction;    
通过transaction视图查看当前活动的事务的事务信息

    XIDUSN    XIDSLOT	  XIDSQN STATUS
---------- ---------- ---------- ----------------
	 8	   11	    1807 ACTIVE          

通过如下sql转换TX锁对应的ID1值进行拆分。输入id1的值,通过如下命令id1可以转换为对应的xidunsn及xidslot。
 select trunc(524299/power(2,16)) as undo_blk#,bitand(524299,to_number('ffff','xxxx')) + 0 as slot# from dual;
Oracle中的锁相关视图介绍(TX、TM)

 

另外可以看到sid20的会话正在请求锁,这时对应的id1和id2并不是事务信息,而是持有锁的事务的回归段信息。当sid144会话提交或回滚后sid20的id1和id2会变为新的值(如下图)。新值才是他的事务回滚段信息。同时sid144 后面的block值为1表示当前事务阻塞了其他事务的进行并不是代表阻塞了多少会话。

Oracle中的锁相关视图介绍(TX、TM)

 

常用sql

  1. 查看当前的TX锁及wAIt时常
select a.sid blocker_sid,
a.serial#,
a.username as blocker_username,
b.type,
decode(b.lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,
b.ctime as time_held,
c.sid as waiter_sid,
decode(c.request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,
c.ctime time_waited from   
v$lock b, v$enqueue_lock c, v$session a 
where  a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = 'TX' and  b.type = 'TX' and  b.block = 1
order by 
time_held, time_waited;
sql 144持有tx锁并且持有993s 阻塞会话20 等待时间980.
Oracle中的锁相关视图介绍(TX、TM)

 

2、TX锁阻塞树

 column event format a30  
  column sess format a20
  set linesize 250
  set pagesize 0
  break on id1 skip 1
select decode(request,0,'Holder:',' Waiter:') || s.inst_id || ':' || s.sid||','|| s.serial# sess,
      id1, id2, lmode, request, l.type, ctime, s.username,s.sql_id, s.event
-- ,s.service_name
  from gv$lock l, gv$session s
  where (id1, id2, l.type) in
    (select id1, id2, type from gv$lock where request>0
    )
   and l.sid=s.sid
   and l.inst_id=s.inst_id    
  order by id1, ctime desc, request 
/
   
Oracle中的锁相关视图介绍(TX、TM)

 

可以看到holder持有锁的会话信息sid 18 serial 231 id1 id2 lmod为6 request为0 tx类型
waiter等待锁的会话信息sid 141 serial 401 id1 id2 lmod为0 request为6 tx类型

3、查看被阻塞会话执行的sql语句

查看被阻塞会话的sql执行语句
 col event for a36 
 col username for a10 
 col sql_fulltext for a80 
 SELECT g.inst_id, 
          g.sid, 
          g.serial#, 
          g.event, 
          g.username, 
          g.sql_hash_value, 
          s.sql_fulltext 
   FROM   gv$session g, 
          v$sql s 
   WHERE  g.wait_class = 'Application' 
          AND g.sql_hash_value = s.hash_value;
Oracle中的锁相关视图介绍(TX、TM)

 

4、查看某个快照周期出现row lock较多的对象

ALTER SESSION SET nls_timestamp_format='DD-MON-RR HH24:MI';
SELECT P.snap_id,
  P.begin_interval_time,
  O.owner,
  O.object_name,
  O.subobject_name,
  O.object_type,
  S.row_lock_waits_delta
FROM dba_hist_seg_stat S,
  dba_hist_seg_stat_obj O,
  dba_hist_snapshot P
WHERE S.dbid               =O.dbid
AND S.ts#                  =O.ts#
AND S.obj#                 =O.obj#
AND S.dataobj#             =O.dataobj#
AND S.snap_id              =P.snap_id
AND S.dbid                 =P.dbid
AND S.instance_number      =P.instance_number
AND S.row_lock_waits_delta > 0
AND P.snap_id BETWEEN      728  AND 729   #替换为你想查的snapid
ORDER BY 1,3,4;
Oracle中的锁相关视图介绍(TX、TM)

 

5、查看锁定的行信息(rowid)

查看到rowid后再根据rowid进行查看行信息。

column  object_name format a30
 SELECT do.object_name ,
       s.row_wait_obj#  ,
       s.row_wait_file# ,
       s.row_wait_block#,
       s.row_wait_row#  ,
       dbms_rowid.rowid_create ( 1, data_object_id, rfile#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )
FROM   v$session s,
       dba_objects do,
       v$datafile v
WHERE  s.blocking_session = &blocking_session                            
AND    s.row_wait_obj# = do.object_id
AND    s.row_wait_file# = v.file#;    输入持有锁的sid信息
Oracle中的锁相关视图介绍(TX、TM)

 

其他视图记录

V$SESSION_WAIT
When a session is waiting on a resource, it can be found waiting on the enqueue wait event

Example:
SELECT * FROM V$SESSION_WAIT WHERE EVENT = 'enqueue';
    SID identifier of session holding the lock
    P1, P2, P3 determine the resource when event = 'enqueue'
    SECONDS_IN_WAIT gives how long the wait did occurs

V$SESSION
Session information and row locking information
    SID, SERIAL# identifier of the session
    EVENT event waited on
    P1, P2, P3 determine the resource when event = 'enqueue'
    # SECONDS_IN_WAIT gives how long the wait did occurs
    LOCKWAIT address of the lock waiting, otherwise null
    ROW_WAIT_OBJ# object identified of the object we are waiting on (object_id of dba_objects)
     ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#
    file_id , block_id and  row location within block of the locked row

V$LOCK
List of all the locks in the system
    SID identifier of session holding the lock
    TYPE, ID1 and ID2 determine the resource
    LMODE and REQUEST indicate which queue the session is waiting on, as follows:
    LMODE > 0, REQUEST = 0 owner
    LMODE = 0, REQUEST > 0 acquirer
    LMODE > 0, REQUEST > 0 converter
    CTIME time since current mode was converted
    BLOCK are we blocking another lock
    BLOCK = 0 non blocking
    BLOCK = 1 blocking others


DBA_LOCK or DBA_LOCKS
Formatted view on V$LOCK (created via $ORACLE_HOME/rdbms/admin/catblock.sql)
    SESSION_ID == SID in V$LOCK
    LOCK_TYPE, LOCK_ID1, LOCK_ID2 formatted value of TYPE, ID1, ID2 from V$LOCK
    MODE_HELD and MODE_REQUESTED formatted value of LMODE and REQUEST from V$LOCK
    LAST_CONVERT == CTIME of V$LOCK
    BLOCKING_OTHERS formatted value of BLOCK from V$LOCK


V$TRANSACTION_ENQUEUE
Subset of V$LOCK for the blocking TX resources only
(same description as for the V$LOCK view)

V$ENQUEUE_LOCK
Subset of V$LOCK for the system resources only and
blocked TX resources only. (same description as for the V$LOCK view)

DBA_DML_LOCKS
Subset of the V$LOCK for the DML (TM) locks only
Created via $ORACLE_HOME/rdbms/admin/catblock.sql
Same description as the DBA_LOCK view

V$LOCKED_OBJECT
Same info as DBA_DML_LOCKS, but linked with the rollback and session information
    XIDUSN, XIDSLOT and XIDSQN rollback information to be linked with V$TRANSACTION
    OBJECT_ID object being locked
    SESSION_ID session id
    ORACLE_USERNAME oracle user name
    OS_USER_NAME OS user name
    PROCESS OS process id
    LOCKED_MODE lock mode


V$RESOURCE
List of all the currently locked resources in the system.
Each row can be associated with one or more rows in V$LOCK
    TYPE, ID1 and ID2 determine the resource


DBA_DDL_LOCKS 
Has a row for each DDL lock that is being held, and one row for each outstanding request for a DDL lock.
It is subset of DBA_LOCKS
Same description as the DBA_LOCK view

DBA_WAITERS
View that retrieve information for each session waiting on a lock (created via $ORACLE_HOME/rdbms/admin/catblock.sql)
    WAITING_SESSION waiting session
    HOLDING_SESSION holding session
    LOCK_TYPE, LOCK_ID1, LOCK_ID2 resource locked
    MODE_HELD lock type held
    MODE_REQUESTED lock type requested


DBA_BLOCKERS
View that gives the blocking sessions (created via  $ORACLE_HOME/rdbms/admin/catblock.sql)
    HOLDING_SESSION holding session


Tags:Oracle   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Oracle正式发布Java 22
Oracle 正式发布 Java 22,这是备受欢迎的编程语言和开发平台推出的全新版本。Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进,包括对Java 语言、其API...【详细内容】
2024-03-21  Search: Oracle  点击:(13)  评论:(0)  加入收藏
oracle数据库基础学习
在当今数字化时代,数据库已成为企业运营的关键要素。而Oracle数据库,作为全球领先的企业级数据库管理系统,更是备受推崇。本文将带您深入了解Oracle数据库的基础知识,帮助您从零...【详细内容】
2024-01-20  Search: Oracle  点击:(106)  评论:(0)  加入收藏
一文聊聊如何快速监控 Oracle 数据库
Cprobe 是一个探针采集器,支持常见数据库、中间件的采集,比如 MySQL、Redis、MongoDB、Oracle、Kafka、ElasticSearch 等。安装配置 Oracle简单起见,我使用 Docker 启动 Oracl...【详细内容】
2023-12-26  Search: Oracle  点击:(141)  评论:(0)  加入收藏
Oracle这个公开漏洞正在被8220挖矿组利用
有的网络攻击组织喜欢极具攻击力的0-Day漏洞,但也有的组织更愿意在那些已经公开的漏洞上下功夫,针对那些未能打好补丁的目标,不断优化策略和技术来逃避安全检测,从而最终实现入...【详细内容】
2023-12-22  Search: Oracle  点击:(121)  评论:(0)  加入收藏
Oracle数据库性能监控:洞察系统瓶颈的利器!
在当今信息时代,企业对于数据的存储和管理变得越来越重要。Oracle数据库作为全球广泛应用的关系型数据库管理系统,承载着大量的业务数据和应用。为了确保数据库的高效稳定运行...【详细内容】
2023-12-18  Search: Oracle  点击:(100)  评论:(0)  加入收藏
Oracle软件在主机平台的应用
// 下 栽 の 地 止 :http://quangneng.com/2573/主机平台通常指的是大型服务器,包括UNIX、Linux、IBM Mainframe等。Oracle数据库在这些主机平台上的应用非常普遍,原因有以下几...【详细内容】
2023-11-30  Search: Oracle  点击:(147)  评论:(0)  加入收藏
Oracle数据库存在不可用索引性能问题
在实践中ORACLE数据库存在不可用索引会引发性能问题。所谓的不可用索引,是指索引自身出了问题,不能被所有SQL使用到。这与因SQL写法不当而无法使用索引的索引失效情况不同。当...【详细内容】
2023-11-23  Search: Oracle  点击:(243)  评论:(0)  加入收藏
Oracle数据库容灾方案:持续运营的保障之道!
Oracle数据库的容灾方案是为了保障数据库持续运营和数据的高可用性而设计的。在企业级应用中,数据库的持续运行对于业务的正常操作至关重要。一旦发生数据库故障或灾难,将会对...【详细内容】
2023-11-23  Search: Oracle  点击:(144)  评论:(0)  加入收藏
Oracle数据库事务管理:确保数据一致性的关键步骤!
事务管理是数据库管理中至关重要的一环,它确保了数据的一致性、完整性和可靠性。Oracle数据库提供了强大的事务管理功能,能够保证多个操作在数据库中作为一个逻辑单元执行,以确...【详细内容】
2023-11-20  Search: Oracle  点击:(202)  评论:(0)  加入收藏
14个开源免费数据库监控工具,MySQL、Oracle、Postgres或MSSQL
在信息系统项目中,UI、业务逻辑、数据库操作、文件操作、网络、API调用等许多环节都有可能产生性能问题,其中,数据库读写是最为常见的操作,我们也发现其实许多项目中的大部分瓶...【详细内容】
2023-11-17  Search: Oracle  点击:(281)  评论:(0)  加入收藏
▌简易百科推荐
Oracle正式发布Java 22
Oracle 正式发布 Java 22,这是备受欢迎的编程语言和开发平台推出的全新版本。Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进,包括对Java 语言、其API...【详细内容】
2024-03-21  OSC开源社区    Tags:Oracle   点击:(13)  评论:(0)  加入收藏
oracle数据库基础学习
在当今数字化时代,数据库已成为企业运营的关键要素。而Oracle数据库,作为全球领先的企业级数据库管理系统,更是备受推崇。本文将带您深入了解Oracle数据库的基础知识,帮助您从零...【详细内容】
2024-01-20  EmSpace    Tags:oracle   点击:(106)  评论:(0)  加入收藏
一文聊聊如何快速监控 Oracle 数据库
Cprobe 是一个探针采集器,支持常见数据库、中间件的采集,比如 MySQL、Redis、MongoDB、Oracle、Kafka、ElasticSearch 等。安装配置 Oracle简单起见,我使用 Docker 启动 Oracl...【详细内容】
2023-12-26      Tags:Oracle   点击:(141)  评论:(0)  加入收藏
Oracle这个公开漏洞正在被8220挖矿组利用
有的网络攻击组织喜欢极具攻击力的0-Day漏洞,但也有的组织更愿意在那些已经公开的漏洞上下功夫,针对那些未能打好补丁的目标,不断优化策略和技术来逃避安全检测,从而最终实现入...【详细内容】
2023-12-22    FreeBuf.COM  Tags:Oracle   点击:(121)  评论:(0)  加入收藏
Oracle数据库性能监控:洞察系统瓶颈的利器!
在当今信息时代,企业对于数据的存储和管理变得越来越重要。Oracle数据库作为全球广泛应用的关系型数据库管理系统,承载着大量的业务数据和应用。为了确保数据库的高效稳定运行...【详细内容】
2023-12-18  编程技术汇  今日头条  Tags:Oracle   点击:(100)  评论:(0)  加入收藏
Oracle软件在主机平台的应用
// 下 栽 の 地 止 :http://quangneng.com/2573/主机平台通常指的是大型服务器,包括UNIX、Linux、IBM Mainframe等。Oracle数据库在这些主机平台上的应用非常普遍,原因有以下几...【详细内容】
2023-11-30  阿小白    Tags:Oracle   点击:(147)  评论:(0)  加入收藏
Oracle数据库存在不可用索引性能问题
在实践中ORACLE数据库存在不可用索引会引发性能问题。所谓的不可用索引,是指索引自身出了问题,不能被所有SQL使用到。这与因SQL写法不当而无法使用索引的索引失效情况不同。当...【详细内容】
2023-11-23  测试小号等闲之辈  微信公众号  Tags:Oracle   点击:(243)  评论:(0)  加入收藏
Oracle数据库容灾方案:持续运营的保障之道!
Oracle数据库的容灾方案是为了保障数据库持续运营和数据的高可用性而设计的。在企业级应用中,数据库的持续运行对于业务的正常操作至关重要。一旦发生数据库故障或灾难,将会对...【详细内容】
2023-11-23  编程技术汇  今日头条  Tags:Oracle   点击:(144)  评论:(0)  加入收藏
Oracle数据库事务管理:确保数据一致性的关键步骤!
事务管理是数据库管理中至关重要的一环,它确保了数据的一致性、完整性和可靠性。Oracle数据库提供了强大的事务管理功能,能够保证多个操作在数据库中作为一个逻辑单元执行,以确...【详细内容】
2023-11-20  编程技术汇  微信公众号  Tags:Oracle   点击:(202)  评论:(0)  加入收藏
从来不是侥幸!Oracle为何独得印度政府青睐?
作者 | Mohit编译 | 小欧出品 | 51CTO技术栈(微信号:blog51cto)今年 8 月,印度教育部宣布选择 Oracle 云基础设施 (OCI) 来改造免费教育技术平台 DIKSHA。小微企业信用保证基金信...【详细内容】
2023-11-17    51CTO  Tags:Oracle   点击:(191)  评论:(0)  加入收藏
站内最新
站内热门
站内头条