Oracle的锁机制原理

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

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

10多年的鸡西网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整鸡西建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“鸡西网站设计”,“鸡西网站推广”以来,每个客户项目都认真落实执行。

一.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的锁机制原理
分享网址:https://www.cdcxhl.com/article32/eohosc.html

成都网站建设公司_创新互联,为您提供定制开发网站建设全网营销推广标签优化自适应网站网页设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管