暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
ORACLE关于锁和V$LOCK的分析
1744
3页
51次
2020-05-24
免费下载
为了实现并发,
oracle
数据库使用了锁机制。要了解锁,首先要了解视图
v$lock
v$lock
这个视图列出
Oracle
服务器当前拥有的锁以及未完成的锁请求。如果你觉着
session
处于等待事件队列当中,那你应该检查视图
v$lock
v$lock
中的常用列有以下列:
sid
:持有锁的会话
SID
,通常与
v$session
关联。
type
:锁的类型,其中
TM
表示表锁或
DML
锁,
TX
表示行锁或事务锁,
UL
表示用户
锁。我们主要关注
TX
TM
两种型的锁,其它均为系统锁,会很快自动释放,不用关注。
Oracle
执行
DML
语句时,系统自动在所要操作的表上申请
TM
类型的锁。当
TM
获得后,系统再自动申请
TX
类型的锁,并将实际锁定的数据行的锁标志位进行置位。
TM
锁包括了
SS
SX
S
X
等多种模式,在数据库中用
0
6
来表示。不同的
SQL
操作
产生不同类型的
TM
锁。
lmode
:会话保持的锁的模式。
0
None
1
Null ;
2
Row-S (SS,
行级共享锁,其他对象
SQL
语句只能查询这些数据行
)
sql
操作有
select for update
lock for update
lock row share
3
Row-X (SX,
行级排它锁
,
在提交前不允许做
DML
操作
)
sql
操作有
insert
update
delete
lock row share
4
Share(
共享锁
)
sql
操作有
create index
lock share
5
S/Row-X (SSX,
共享行级排它锁
)
sql
操作有
lock share row
exclusive
??
6
Exclusive(
排它锁
)
alter table
drop table
drop index
truncate
table
look exclusive
DDL
注释:
Row-S (SS,
行级共享锁)和
Row-X (SX,
行级排它锁)中的第一个
S
表示表
被共享,如果表不被共享,就谈不上其下级的行级锁是否被共享还是排他了。表级别为
X
,行级锁就不被其他会话访问,所以也就没
XX
XS
模式,只有
X
模式。
ID1,ID2: ID1,ID2
的取值含义根据
type
的取值而有所不同,对于
TM
ID1
表示被
锁定表的
object_id
可以和
dba_objects
视图关联取得具体表信息,
ID2
值为
0
(即表示
type=TM
时,用不到
ID2
列,故将其置为零);对于
TX
ID1
以十进制数值表示该事
务所占用的回滚段号和事务槽
slot number
号,其组形式
:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2
以十进制数
值表示环绕
wrap
的次数,即事务槽被重用的次数。实际上这两个字段构成了事务在回滚
段中的位置。
当锁产生时,以下图为例说明
v$lock
1
、图中存在两个
session
分别是
133
135
session135
BLOCK=1
意味着该
session
拥有一个锁,并阻塞了其他
session
的对该锁的请求。该锁的类型由
TY
定义,
模式由
LMODE
字段定义;
2
session133
request=6
说明该
session
正在等待一个
lmode
6
的锁,而该锁
的拥有者正是
session135
3
、对于
TM
锁,
ID1Z
值就是加锁的段对象,可以是表或者表分区,此时
ID2
一般为
0
对于
TX
锁,这两个字段构成该事务在回滚段中的位置。
对于死锁的处理流程:
1,
查找锁:
select ls.osuser os_user_name,
ls.username user_name,
ls.type lock_type,
o.object_name object,
decode(ls.lmode,1,null,2,'Row Share',3,'Row Exclusive',4,'Share',5,'Share Row
Exclusive',6,'Exclusive',null) lock_mode,
o.owner,
ls.sid,
ls.serial# serial_num,
ls.id1,ls.id2,
ls.paddr
from sys.dba_objects o,
(select s.osuser,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial#,l.id1,l.id2
from v$session s,v$lock l where s.sid=l.sid) ls
where o.object_id=ls.id1 and o.owner<>'SYS' order by o.owner,o.object_name
2
,查找
spid
select a.spid,a.username,b.program from v$process a,v$session b where
a.addr=b.paddr and a.addr='000007FF2DC8E578';
3
kill
进程
alter system kill session 'sid,serial#' immediate;
orakill sid spid
sid
:表示要杀死的进程属于的实例名
thread
:是要杀掉的线程号,即第
2
步查询出的
spid
of 3
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜