oracle的TM锁、TX锁
(2013-02-01 09:23:47)
标签:
oracletm锁tx锁it |
一.基本概念
Oracle数据库的锁类型
(1)
(2)
(3)
DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
二.常见DML锁分类
DML锁分类表
|
锁模式 |
|
|
|
|
0 |
|
|
|
|
1 |
|
|
|
|
2 |
|
其他对象只能查询这些数据行 |
|
|
3 |
SX(Row-X) |
在提交前不允许做DML操作 |
|
|
4 |
|
|
|
|
5 |
|
|
|
|
6 |
|
|
Lock exclusive |
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
1级锁有:Select,有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share
select for update当对话使用for
update子串打开一个光标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其它对象只能查询这些数据行,不能进行update、delete或select
for update操作,insert的操作还是可以的。
(但是在11g的实验中使用select
for
update产生的锁确实3级锁)
3级锁有:Insert,
Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁,
我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作会提示ora-00054错误。
ORA-00054: resource busy and acquire with NOWAIT specified
(ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源)
5级锁有:Lock Share Row Exclusive
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
当对父表进行修改时,若子表对应的记录存在,则产生ORA-02292异常;否则只对父表加TX锁和RX锁;
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock
Exclusive
三.常见相关锁的视图
1.关于V$lock表和相关视图的说明
--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
CTIME
NUMBER
Time since current mode was granted
BLOCK
NUMBER
The lock is blocking another lock
0, 'Not Blocking',
1, 'Blocking',
2, 'Global',
--该锁是否阻塞了另外一个锁
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一致。 |
四.常见的SQL查询
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
from
where
--通过SID,
--alter
也可以在操作系统层面kill
在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 #spid(即上面查到的spid)
2)在windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即上面查到的spid。
例:c:>orakill orcl #spid
8.
select s.username, o.object_name, s.machine, s.sid, s.serial#, k.type,k.LMODE,k.BLOCK

加载中…