`

Oracle lock之分析

 
阅读更多
Oracle 锁
Oracle的锁是针对多个会话进行作用的,没有并发就没有锁。
锁的实质:是维护一个事务完整性的,锁的信息是数据块的一个属性,是物理的,并不是逻辑上属于某个表或者某几行的。


Oracle锁的分类

Enqueues --队列类型的锁,通常和业务相关
Latches --系统资源方面的锁,比如内存结构,sql解析。


 分别模拟insert,update和delete造成阻塞的示例

--INSERT 阻塞
CREATE TABLE T (ID INT PRIMARY KEY,NAME VARCHAR2(10)); 


ADMIN@ORCL> INSERT INTO T VALUES(1,'ANKER'); 

1 ROW CREATED. 

--另外一个会话被阻塞
ADMIN@ORCL> INSERT INTO T VALUES(1,'YANGEOO'); 


--从结果可以看出,会话197在请求持有模式为4的TX锁,而被会话9所阻塞
字段解释:
SID:会话id号
TYPE:锁的类型 TM表锁,发生在DML操作时,目的是保证操作能够正常进行,并且阻止其他人对表DDL操作。TX锁 事务锁(行锁)对于被修改的数据,阻止其他会话进行修改。
ID1:会话操作对象的id号
ID2:ID1+ID2 定位回滚段上的一个地址(即修改之前数据镜像地址),若TX锁的ID1+ID2相同,意味着操作的是同一行数据
LMODE:锁模式,不同的数字代表不同的锁模式  例如  0 现在没有申请到锁 3 共享锁模式(段级共享锁) 6 排他锁模式   锁的级别越高限制越多
REQUEST:目前会话没有锁,正在申请的锁模式
BLOCK:当前是否在阻塞会话  例如  1 当前正在阻塞一个会话



admin@ORCL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
  2    FROM V$LOCK
  3   WHERE TYPE IN ('TM', 'TX')
  4   ORDER BY SID, TYPE; 

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
         9 TM      15130          0          3          0          0
         9 TX     327692        295          6          0          1
       197 TM      15130          0          3          0          0
       197 TX     327692        295          0          4          0
       197 TX     196629        297          6          0          0
       
--UPDATE 阻塞 

admin@ORCL> update t set NAME = 'ANKER1' where id = 1; 

1 row updated. 

admin@ORCL> update t set name='ANKER2' where id =1; 

--结果可以看出会话197在请求模式为6的TX锁,而此锁已被会话9占用,引起阻塞
admin@ORCL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
  2    FROM V$LOCK
  3   WHERE TYPE IN ('TM', 'TX')
  4   ORDER BY SID, TYPE; 

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
         9 TM      15130          0          3          0          0
         9 TX     196610        298          6          0          1
       197 TM      15130          0          3          0          0
       197 TX     196610        298          0          6          0 

--DELETE 阻塞 

admin@ORCL> delete t where ID = 1; 

1 row deleted. 

admin@ORCL> delete t where ID = 1; 

--查看结果,会话197在请求模式6的TX锁,而被会话9阻塞
admin@ORCL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
  2    FROM V$LOCK
  3   WHERE TYPE IN ('TM', 'TX')
  4   ORDER BY SID, TYPE; 

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
         9 TM      15130          0          3          0          0
         9 TX     393237        296          6          0          1
       197 TM      15130          0          3          0          0
       197 TX     393237        296          0          6          0
 

 --当出现锁等待时,锁等待对应的事件,
 enq = enqueque
从以下event中也可以看出会话197产生了行锁竞争的事件,也意味着197会话在等待其他会话释放tx锁。

admin@ORCL> SELECT SID,EVENT FROM V$SESSION_WAIT WHERE WAIT_CLASS <> 'Idle'
  2  ;

       SID EVENT
---------- ----------------------------------------------------------------
       197 enq: TX - row lock contention




--2.模拟RI锁定导致阻塞的场景
--经过测试,在主表上insert时,会在从表上加一个3模式的TM锁,而update与delete均不在从表上加锁。
以下测试是对从表操作,导致主表阻塞。
当修改从表时,针对主表update 主键或者delete操作时,均会阻塞住。这是因为在主表修改或删除记录时,它需要查看从表中有没有
对应的值。
创建索引后,就没有这个问题。

admin@ORCL> CREATE TABLE P(ID INT PRIMARY KEY,NAME VARCHAR2(10));
admin@ORCL> CREATE TABLE C (ID REFERENCES P (ID),NAME VARCHAR2(10));
admin@ORCL> insert into p values(1,'A');
admin@ORCL> insert into p values(2,'B');
admin@ORCL> insert into p values(3,'C');

--130会话
admin@ORCL> update c set name = 'E' where id = 1;

1 row updated.

admin@ORCL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
  2    FROM V$LOCK
  3   WHERE TYPE IN ('TM', 'TX')
  4   ORDER BY SID, TYPE;

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
       130 TM      15515          0          3          0          0
       130 TX     393238        421          6          0          0

--10会话被阻塞
admin@ORCL> delete p where id = 4;

--查看 v$lock,p在进行删除操作时,会在15515表上添加一个4级别的TM锁,导致阻塞。
admin@ORCL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
  2    FROM V$LOCK
  3   WHERE TYPE IN ('TM', 'TX')
  4   ORDER BY SID, TYPE;

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
        10 TM      15513          0          3          0          0
        10 TM      15515          0          0          4          0
       130 TM      15515          0          3          0          1
       130 TX     393238        421          6          0          0

--锁模式与相互的排斥

模式	锁定的SQL				排斥的模式	允许的DML
2	lock table in row share mode		6		select,insert,update,delete,for update
3	lock table in row exclusive mode	4,5,6		select,insert,update,delete,for update
4	lock table in share mode		3,5,6		select
5	lock table in share row exclusive mode	3,4,5,6		select
6	lock table t in exclusive mode		2,3,4,5,6	select

Oracle TM锁的类型
模式2
Row Share(RS)又叫(SS) 
行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存
Lock table t in row share mode;

 
模式3
Row Exclusive Table Lock(RX)又叫(SX)
行级排他锁,通常已经有事务在修改行或者select…for update 修改结果集。允许其他事务对锁定的表进行select  insert  update  delete 或 lock table 
同时锁定一张表

模式4
Share Table Lock(S)
共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它
 
模式5
Share Row Exclusive Table Lock(SRX)又叫SSX
共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改
 
模式6
Exclusive Table Lock (X)
排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表
一个表一般只能有一个6号锁

 
--查看当前是否有堵塞
SELECT WAIT_S.SID              AS WAIT_SESSION,
       WAIT_SQL.SQL_TEXT       AS WAIT_SQL,
       WAIT_S.BLOCKING_SESSION AS LOCK_SESSION,
       OBJS.OBJECT_NAME        AS LOCK_OBJECTS,
       OBJS.OBJECT_TYPE        AS LOCK_OBJ_TYPE
  FROM V$SESSION WAIT_S
INNER JOIN V$SQL WAIT_SQL
    ON WAIT_S.SQL_ID = WAIT_SQL.SQL_ID
INNER JOIN V$LOCKED_OBJECT LOCK_OBJ
    ON LOCK_OBJ.SESSION_ID = WAIT_S.BLOCKING_SESSION
INNER JOIN DBA_OBJECTS OBJS
    ON OBJS.OBJECT_ID = LOCK_OBJ.OBJECT_ID
WHERE WAIT_S.LOCKWAIT IS NOT NULL;

--查询哪些session 锁定了哪些object
SELECT S.SID,B.OWNER, B.OBJECT_NAME, S.USERNAME, S.MACHINE, S.TERMINAL, S.PROGRAM
  FROM V$LOCKED_OBJECT L, DBA_OBJECTS B, V$SESSION S
WHERE L.OBJECT_ID = B.OBJECT_ID
   AND L.SESSION_ID = S.SID

 

0
0
分享到:
评论

相关推荐

    oracle lock and isolation at

    Oracle数据库是世界上最广泛使用的数据库系统之一,其在处理并发事务和数据一致性方面有着强大的机制。在Oracle中,锁(Lock)和隔离级别(Isolation Level)是确保多用户环境下数据一致性和完整性的关键组成部分。...

    lock_table.rar_Table_lock table_oracle lock table

    在Oracle数据库系统中,"lock table" 是一个重要的管理功能,用于控制多个用户对特定表的并发访问。当一个用户对表执行修改...通过分析和应用压缩包内的脚本,管理员可以更好地理解和解决Oracle数据库中的锁定问题。

    ORACLE关于锁和V$LOCK的分析.docx

    ORACLE 锁机制和 V$LOCK 视图分析 Oracle 数据库为了实现并发操作,使用了锁机制来控制对数据的访问。锁机制是 Oracle 数据库并发控制的核心机制之一。锁机制能够有效地防止多个用户同时访问同一个数据项,避免了...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    ### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...

    Oracle中的Latch和Lock.pdf

    Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它在...在实际操作中,可以利用Oracle提供的相关视图(如V$LOCK、V$LATCH等)和SQL语句来监控和分析Latch和Lock的状态,以更好地理解和优化数据库的并发行为。

    ORACLE11G性能分析及优化对策

    Oracle 11g作为Oracle数据库的重要版本之一,其性能优化是确保数据库高效稳定运行的关键因素。本文档旨在深入探讨Oracle 11g的性能分析与优化策略,帮助数据库管理员(DBA)和开发人员更好地理解和解决性能问题。 ###...

    oracle--lock.zip_oracle

    在`oracle_lock.txt`文件中,可能包含具体的表锁问题实例和解决方案,例如如何处理死锁,如何通过SQL查询定位锁冲突,以及如何避免不必要的锁等待。 综上所述,理解并熟练掌握Oracle的表锁机制对于优化数据库性能、...

    oracle死锁故障分析和诊断解决

    ### Oracle死锁故障分析与诊断解决 在Oracle数据库管理中,死锁是一个常见的问题,它发生在两个或多个事务互相等待对方释放资源时,导致所有事务都无法继续执行的情况。本文将深入探讨Oracle死锁的原因、诊断方法及...

    [Oracle] 浅谈Lock与Latch

    在日常数据库维护中,应密切关注等待事件,分析Lock和Latch的使用情况,以便找出性能瓶颈并采取相应措施进行优化。例如,优化SQL语句,减少Lock冲突;调整数据库参数,改善Latch竞争;或者通过绑定变量减少全表扫描...

    基于SQL和Oracle数据库安全分析

    ### 基于SQL和Oracle数据库安全分析 #### 引言 随着信息技术的快速发展,数据库已成为各类组织机构的核心资产之一。然而,随着数据库系统的重要性和复杂性不断增加,其面临的潜在安全威胁也日益增多。本文主要探讨...

    在分布式事务中实现基于Oracle PLSQL UL LOCK的悲观离线锁

    本文将深入探讨如何在分布式事务中实现基于Oracle PL/SQL的Ultra Lock(悲观离线锁)机制。 Ultra Lock是一种加强型的锁定策略,用于在高并发环境下提供更精确的并发控制。 Oracle PL/SQL是一种强大的编程语言,它...

    library cache lock等待事件处理

    在Oracle数据库管理与性能优化的过程中,遇到“library cache lock”等待事件是常见的问题之一,它直接影响到系统的响应时间和整体性能。本文将深入解析这一事件,包括其产生原因、诊断方法以及可能的解决策略。 ##...

    oracle常用性能分析语句执行情况等语句总结

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,特别是在企业级应用中,其性能优化和问题排查显得尤为重要。本篇文章将总结一些常用的Oracle性能分析和查询语句,帮助管理员了解系统运行状况,定位并解决性能...

    oracle rac 性能分析与调整

    在Oracle RAC环境下,性能分析与调整至关重要,因为系统的性能表现可能与单实例环境有所不同。以下是对Oracle RAC性能调优的深入探讨: ### RAC调优基本思路 1. **应用设计调整**:在设计阶段就应考虑RAC环境,...

    BLOG_【故障处理】Oracle_lhr_队列等待之TX - row lock contention

    ### 故障处理:Oracle_lhr_队列等待之TX - row lock contention #### 一、概述 在Oracle数据库管理中,“enq:TX-rowlockcontention”是一种常见的队列等待事件,通常与行级别的锁定冲突有关。这种冲突可能会导致...

    高级owi与oracle性能调优

    掌握Oracle等待事件的分析方法和性能调优技术,可以显著提升Oracle数据库的整体性能,为应用系统的稳定运行提供坚实保障。而由于本文无法使用内容页码进行验证,上述知识点的说明是基于当前信息对高级OWI和Oracle...

Global site tag (gtag.js) - Google Analytics