Oracle的锁机制原理

发布时间:2021-08-16 21:18:21 作者:chen
来源:亿速云 阅读:125

本篇内容主要讲解“Oracle的锁机制原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle的锁机制原理”吧!


一.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
---------- -- ----------
       128  TM          3
       128  TX          6

SQL> select session_id,locked_mode from v$locked_object;

SESSION_ID LOCKED_MODE
---------- -----------
       128           3

示例2:
SQL> select * from test for update;

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

       SID TY      LMODE
---------- -- ----------
        36 TM          3
        36 TX          6

SQL> select session_id,locked_mode from v$locked_object;

SESSION_ID LOCKED_MODE
---------- -----------
        36           3

有时候查询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来释放锁。

五.相关参数:

dml_locks=0(dml_locks相关含义请看另一篇文章:http://space.itpub.net/23135684/viewspace-626728)

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
---------- ---- ----------
       128  TX            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语句对表进行操作。

到此,相信大家对“Oracle的锁机制原理”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. Oracle中锁机制
  2. Oracle 锁机制学习

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

oracle

上一篇:mysql使用sql导出成excel的方法

下一篇:debian下怎么增强bash的自动补全功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》