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
相关推荐
Oracle数据库是世界上最广泛使用的数据库系统之一,其在处理并发事务和数据一致性方面有着强大的机制。在Oracle中,锁(Lock)和隔离级别(Isolation Level)是确保多用户环境下数据一致性和完整性的关键组成部分。...
在Oracle数据库系统中,"lock table" 是一个重要的管理功能,用于控制多个用户对特定表的并发访问。当一个用户对表执行修改...通过分析和应用压缩包内的脚本,管理员可以更好地理解和解决Oracle数据库中的锁定问题。
ORACLE 锁机制和 V$LOCK 视图分析 Oracle 数据库为了实现并发操作,使用了锁机制来控制对数据的访问。锁机制是 Oracle 数据库并发控制的核心机制之一。锁机制能够有效地防止多个用户同时访问同一个数据项,避免了...
### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...
Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它在...在实际操作中,可以利用Oracle提供的相关视图(如V$LOCK、V$LATCH等)和SQL语句来监控和分析Latch和Lock的状态,以更好地理解和优化数据库的并发行为。
Oracle 11g作为Oracle数据库的重要版本之一,其性能优化是确保数据库高效稳定运行的关键因素。本文档旨在深入探讨Oracle 11g的性能分析与优化策略,帮助数据库管理员(DBA)和开发人员更好地理解和解决性能问题。 ###...
在`oracle_lock.txt`文件中,可能包含具体的表锁问题实例和解决方案,例如如何处理死锁,如何通过SQL查询定位锁冲突,以及如何避免不必要的锁等待。 综上所述,理解并熟练掌握Oracle的表锁机制对于优化数据库性能、...
### Oracle死锁故障分析与诊断解决 在Oracle数据库管理中,死锁是一个常见的问题,它发生在两个或多个事务互相等待对方释放资源时,导致所有事务都无法继续执行的情况。本文将深入探讨Oracle死锁的原因、诊断方法及...
在日常数据库维护中,应密切关注等待事件,分析Lock和Latch的使用情况,以便找出性能瓶颈并采取相应措施进行优化。例如,优化SQL语句,减少Lock冲突;调整数据库参数,改善Latch竞争;或者通过绑定变量减少全表扫描...
### 基于SQL和Oracle数据库安全分析 #### 引言 随着信息技术的快速发展,数据库已成为各类组织机构的核心资产之一。然而,随着数据库系统的重要性和复杂性不断增加,其面临的潜在安全威胁也日益增多。本文主要探讨...
本文将深入探讨如何在分布式事务中实现基于Oracle PL/SQL的Ultra Lock(悲观离线锁)机制。 Ultra Lock是一种加强型的锁定策略,用于在高并发环境下提供更精确的并发控制。 Oracle PL/SQL是一种强大的编程语言,它...
在Oracle数据库管理与性能优化的过程中,遇到“library cache lock”等待事件是常见的问题之一,它直接影响到系统的响应时间和整体性能。本文将深入解析这一事件,包括其产生原因、诊断方法以及可能的解决策略。 ##...
Oracle数据库是世界上最广泛使用的数据库管理系统之一,特别是在企业级应用中,其性能优化和问题排查显得尤为重要。本篇文章将总结一些常用的Oracle性能分析和查询语句,帮助管理员了解系统运行状况,定位并解决性能...
在Oracle RAC环境下,性能分析与调整至关重要,因为系统的性能表现可能与单实例环境有所不同。以下是对Oracle RAC性能调优的深入探讨: ### RAC调优基本思路 1. **应用设计调整**:在设计阶段就应考虑RAC环境,...
### 故障处理:Oracle_lhr_队列等待之TX - row lock contention #### 一、概述 在Oracle数据库管理中,“enq:TX-rowlockcontention”是一种常见的队列等待事件,通常与行级别的锁定冲突有关。这种冲突可能会导致...
掌握Oracle等待事件的分析方法和性能调优技术,可以显著提升Oracle数据库的整体性能,为应用系统的稳定运行提供坚实保障。而由于本文无法使用内容页码进行验证,上述知识点的说明是基于当前信息对高级OWI和Oracle...