`
trophy
  • 浏览: 178467 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

【转】Oracle TM锁 TX锁

 
阅读更多

转自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';

分享到:
评论

相关推荐

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    Oracle的锁表与解锁

    2. **TM锁(表级锁)**:这是一种更高层次的锁,通常用于锁定整个表,防止其他用户或事务访问该表。这种锁可以由DBA手动设置,例如在进行大表的备份或维护操作时,可以使用`ALTER TABLE`命令加上`SHARE`或`EXCLUSIVE...

    Oracle数据库的锁类型

    DML锁主要关注的是数据级别的锁控,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。这些锁在执行DML(数据操纵语言)操作时自动触发,以确保数据在并发环境下的完整性和一致性。 ##### 1. TM锁:表级锁 TM锁是针对...

    oracle常见的锁查询和处理

    Oracle数据库的锁机制是保证数据并发访问安全的重要手段,它主要分为行级锁(TX锁)和表级锁(TM锁)。行级锁确保在多用户环境下,同一时间只有一个用户可以更新特定的数据行,而其他用户可以读取,但不能进行修改。...

    ORACLE锁深入分析

    在上述示例中,创建表`t1`和`t2`、向它们插入数据并提交事务,然后尝试更新`t1`表的某一记录,这个过程中Oracle会自动管理TM锁和TX锁,确保在更新期间数据的完整性。 在查询`V$LOCKED_OBJECT`视图时,可以看到当前...

    oracle锁表及解锁

    Oracle中的锁主要有两种类型:表级锁(Table Locks)和行级锁(Row Locks),分别由`TM`和`TX`标识。表级锁通常用于DML操作或DDL操作,而行级锁则是在执行更新、插入或删除等操作时自动产生的。 #### 检查锁定情况 ...

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

    Oracle 锁机制中,TM 锁和 TX 锁是两个重要的锁类型。TM 锁是表锁或 DML 锁,用于控制对表的访问。TX 锁是行锁或事务锁,用于控制对行的访问。TM 锁包括了 SS、SX、S、X 等多种模式,在数据库中用 0 -6 来表示。...

    Oracle的锁内幕解惑

    例如,在Tom Kyte的著作《Export Oracle Database Architecture 9i & 10g & 11g》中,DML锁被分为两类:TM锁和TX锁。而在另一份资料《Dsi405》中,则将DML锁分为Row Locks和Table Locks两种。其中, - **TM锁**...

    理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf

    本文主要探讨Oracle数据库中的TM锁和TX锁机制,以及如何解决由锁引起的事务阻塞问题。 首先,Oracle的TM(Transaction Manager)锁机制是用于控制事务对数据的并发访问。TM锁主要有四种类型:SS(Shared Shared)、...

    Oracle数据库锁的研究.pdf

    - DML锁(Data Manipulation Language Locks):用于数据操作,包括行级锁(TX锁)和表级锁(TM锁)。行级锁在事务对数据行进行修改时自动获取,如INSERT、UPDATE、DELETE和SELECT...FOR UPDATE语句会引发行级锁。...

    oracle锁机制_bzm整理1

    在执行DML语句时,首先获取TM锁,然后申请具体的行级锁(TX锁)。在检查锁相容性时,通过TM锁模式的检查即可,无需逐行检查,提高了效率。 5. **TX锁的细分类型**: - 行级共享锁(RS锁) - 行级排他锁(RX锁) ...

    oracle锁机制

    DML锁主要用于确保数据操作时的完整性,其中TM锁(表级锁)和TX锁(事务锁或行级锁)是核心部分。TM锁在事务开始时获取,对整个表施加控制,而TX锁则针对具体的行数据,确保行级别的并发控制。TM锁有多种模式,如SS...

    oracle 解锁 语句

    decode(l.type, 'TM', 'TABLELOCK', 'TX', 'ROWLOCK', NULL) LOCK_LEVEL, o.owner, o.object_name, o.object_type, s.sid, s.serial#, s.terminal, s.machine, s.program, s.osuser FROM v$session s, v$lock l,...

    关于Oracle数据库中的锁机制深入研究

    在实际应用中,Oracle数据库的DML锁(数据锁)进一步细分为TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁用于保护整个表,而TX锁则更具体,锁定的是数据行。当执行DML语句时,系统首先获取TM锁,然后获取TX锁以锁定...

    oracle数据表解锁

    'TM', 'TABLE LOCK', 'PW', 'TABLE LOCK', 'TO', 'TABLE LOCK', 'TS', 'TABLE LOCK', 'RT', 'ROW LOCK', 'TX', 'ROW LOCK', 'MR', 'S(Share)', NULL) 锁定方式, C.MACHINE 用户组, C.TERMINAL ...

    oracle锁讲解笔记

    DML锁又细分为表级锁(TM)和行级锁(TX)。 - **表级锁(TM)**:用于保护表级别的操作,防止DDL语句的执行。 - **行级锁(TX)**:用于保护行级别的数据操作,确保在同一时间只有一个事务可以修改某行数据。 ...

    相克军 ORACLE 讲座 深度剖析 锁 笔记

    - **Lock 锁**:主要分为行级锁(TX)和表级锁(TM)。行级锁分为共享锁(Shared)和排他锁(Exclusive),用于保护数据行,确保并发操作的安全。 2. **行级锁(DML语句)** - **事务锁(TX)**:行级锁最小粒度...

    Oracle的锁表与解锁—oracle培训[参考].pdf

    主要分为两种基本类型的锁:行级锁(TX,Row Lock)和表级锁(TM,Table Lock)。行级锁用于锁定单个数据行,以防止并发事务对同一行进行冲突修改。而表级锁则锁定整个表,限制其他用户对表的读写操作。 当发生锁...

Global site tag (gtag.js) - Google Analytics