新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容主要讲解“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语句对表进行操作。