oracle内存锁,Oracle锁机制

按照类型划分,锁可分为排他锁和共享锁。按照对象划分,锁可分为事务锁,DML锁,DDL锁,内存锁(Latch)。

一.ORACLE中有关锁的动态性能视图主要有:

V$LOCK

This view lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.

TM锁的ID1字段表示对象的ID号,可以通过DBA_OBJECTS.OBJECT_ID来查到具体的对象。

TX锁的ID1代表的是事务的回滚段回滚段号、事务槽号,ID2代表的是顺序号。(V$TRANSACTION.XIDSQN表示事务槽号)

有关VLOCK.ID1和ID2的含义可参考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468

BLOCK字段如果等于1的话,表示此锁阻塞了其他DML语句的执行,正常应该为0。

BLOCK字段的含义: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 */

$ORACLE_HOME/rdbms/admin/catblock.sql

特别注意:0表示没有阻塞,而不是表示没有锁。

如果要查询是否有会话阻塞了其他会话:

SELECT * FROM V$LOCK WHERE BLOCK=1;

通过查询V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION两个字段也可以查看到阻塞其他的会话。

如果LMODE为0,REQUEST大于1,表示在获取锁的时候失败,发生了相应锁的阻塞。例如,在执行DML语句时,如果TYPE=TM,LMODE=0,REQUEST=3,就表示此DML语句在获取表的TM锁的行排它锁时被阻塞,处于等待状态。

查找阻塞事务的事务会话信息:

select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被锁的会话的SID)

V$LOCKED_OBJECT

This view lists all locks acquired by every transaction on the system.

V$LOCK_TYPE

二.其中我们主要查看的是:

LOCK TYPE(按对象划分)

V$LOCK_TYPE保存了所有的LOCK TYPE的相关信息。

主要的有:

TM - DML enqueue

TX - Transaction enqueue

UL - User supplied

MR -Media Recovery

MR锁用于保护数据文件,使得文件在数据库打开、表空间Online时不能执行恢复。当进程对数据文件进行恢复时,需要排他的获得MR锁。当数据库打开时,每个文件上都分配一个MR锁。ID1代表文件号,也包含了201临时文件。

从Oracle 11g开始,每个登录的会话都会有一个默认的AE锁。

LOCK MODE(按类型划分)

0 - none

1 - null (NULL)

2 - row-S (SS)    //行共享

3 - row-X (SX)    //行排它

4 - share (S)     //共享

5 - S/Row-X (SSX) //共享行排它

6 - exclusive (X) //排它

从以上LOCK MODE也能看出按类型分锁只有2种,共享(S),排它(X),把他们不同的组合就成了不同的LOCK MODE了。如果添加的是X锁,那么其他任何锁也不能再添加到此行或表上了。

TM就是DML锁,是表级上的锁。TX是事务锁,是行级锁。在执行DML操作时,先对表加TM锁,如果加锁成功,然后再加TX锁。一般情况下,一个会话中,只会出现一个TX锁,可能有多个TM锁,这些TM所共享一个TX锁。不同的语句加TM锁的类型不同,类型就是下面说的LOCK MODE。在表级上加了TM锁也是为了防止其他会话再在表上加上排它锁(例如对表执行DDL语句)。一个表上可以加上多个TM锁、TX锁的。例如,A会话更新了TEST表上ID号为1的一条记录,首先会先在这个表上加上一个TM锁,加锁成功,会在ID为1的行上加上一个TX锁。如果有另外一个会话来同样来更新ID为1的记录就会发生阻塞,因为加TM锁能成功,但是加TX锁失败。如果更新的记录是ID=2那么就是成功的。这是表上就存在多个TM、TX锁。如果在表上加上TM锁成功,那么除了在V$LOCK会有相应的记录外,V$LOCKED_OBJECT也有相应对象的记录。

行级锁只有排他锁没有共享锁。

另外,select语句不会添加任何锁,所以一般的TX,TM锁都不会阻塞select语句的执行。唯一能阻塞select语句执行的是latch锁,一旦发生latch锁阻塞select语句的执行,对系统的正常运行非常的大,甚至会导致系统的崩溃。

三.示例

示例1:

SQL> update test set segment_name='test' where wner='SYS';

已更新4044行。

SQL> select sid,type,lmode from v$lock where sid=128;

SID TY      LMODE

---------- -- ----------

128TM          3

128TX          6

SQL> select session_id,locked_mode from v$locked_object;

SESSION_ID LOCKED_MODE

---------- -----------

1283示例2:

SQL> select * from test for update;

SQL> select sid,type,lmode from v$lock where sid=36;

SID TY      LMODE

---------- -- ----------

36TM          3

36TX          6

SQL> select session_id,locked_mode from v$locked_object;

SESSION_ID LOCKED_MODE

---------- -----------

363有时候查询v$LOCK会发现只有TM锁,没有TX锁,那是因为在执行DML语句或select ...for update语句时操作的记录是0条,所以只加上了TM锁,没有行需要加TX锁。

四.手动添加锁:

级别从低到高,SS可以添加除了X其他的所有类型的锁。而X锁不能添加其他任何的锁。

创建索引时添加的是TM的S锁,MODE值为4,这个时候是不允许执行任何的DML语句的,因为无法在表上添加任何其他排它类型的TM锁。当然我们在创建索引时可以指定ONLINE关键字,可以避免阻塞DML语句情况的出现。

//行共享 SS

LOCK TABLE TABLE_NAME IN ROW SHARE MODE;

//行排它 SX

LOCK TABLE TABLE_NAME IN ROW EXCLUSIVE MODE;

//共享锁 S

LOCK TABLE TABLE_NAME IN SHARE MODE;

//共享行排它 SSX

LOCK TABLE TABLE_NAME IN SHARE ROW EXCLUSIVE MODE;

//排它锁 X

LOCK TABLE TABLE_NAME IN EXCLUSIVE MODE;

通过ROLLBACK或COMMIT来释放锁。

五.相关参数:

SQL> update test set segment_name='test' where wner='SYS';

已更新4044行。

SQL> select sid,type,lmode from v$lock where sid=128;

SID TYPE      LMODE

---------- ---- ----------

128TX            6

SQL> select session_id,locked_mode from v$locked_object;

未选定行

SQL> drop table test;

drop table test

*

第 1 行出现错误:

ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0

由此证明:如果dml_locks=0,那么执行dml语句,表级的TM锁已经不存在了,但是行级别的TX事务锁还是存在的。由于不能在表级上添加任何锁,所以更无法执行DDL语句对表进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值