【Oracle九大性能视图】之1.v$lock_处理TX锁实验及总结

【Oracle九大性能视图】之1.v$lock_处理TX锁实验及总结 原文出自 飞鹰工作室
SQL> desc v$lock;
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
ADDR                                               RAW(8)
KADDR                                              RAW(8)
SID                                                NUMBER
TYPE                                               VARCHAR2(2)
ID1                                                NUMBER
ID2                                                NUMBER
LMODE                                              NUMBER
REQUEST                                            NUMBER
CTIME                                              NUMBER
BLOCK                                              NUMBER

锁的分类:
0、无
1、NULL,可以某些情况下,如分布式数据库的查询会产生此锁。
2、SS,表结构共享锁
3、SX,表结构共享锁+被操作的记录的排它锁
4、S, 表结构共享锁+所有记录共享锁
5、SRX 表结构共享锁+所有记录排它锁
6、X   表结构排它锁+所有记录排它锁
表上的5种锁的含义:
RS(SS):是一种纯粹的意向锁,它表征事务要通过SELECT FOR UPDATE访问某些行;
RX(SX):是一种纯粹的意向锁,它表征事务要通过 UPDATE/ DELETE/INSERT修改某些行;
S:全表范围的共享锁,不需要在每行上做出标识;
X:全表范围的排它锁,不需要在每行上做出标识;
SRX(SSX):是意向锁RX与S锁的组合,它表征事务既对表加S锁,同时要修改个别行,即要在个别行上加X锁;(如果你使用ORACLE8,可以在一个表上建立一个自引用,如EMP表上的MGR引用EMPNO,删除一条记录,可以观察到SRX锁)
在行上,ORALCE只有X锁,
但由SELECT FOR UPDATE 获得的X锁在表级表征为RS锁,
由INSERT/UPDATE/DELETE 获得的X锁在表级表征为RX锁,

窗口1:
SQL> conn fmismain/fmismain
已连接。
SQL> update xtdw set MC='广东电网公司中山供电局本部ok' where dh='0114';

窗口2:
SQL> conn fmismain/fmismain
已连接。
SQL> update xtdw set MC='广东电网公司中山供电局本部ok' where dh='0114';
处理过程:
查看是否有session阻塞:
select * from v$lock where BLOCK=1
    ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
1 1FE0C654 1FE0C770 151 TX 131115 520 6 0 669 1
查看TX锁的SID与Serial#:
select * from v$session where event like'%TX%';
select sid,serial#,username,state,blocking_session_status,blocking_session from v$session where event like'%TX%';

    SID SERIAL# USERNAME STATE BLOCKING_SESSION_STATUS BLOCKING_SESSION
1 137 6 FMISMAIN WAITING VALID 150
临时KILL这个session:
分两类,
第一:kill掉137,6,则是kill掉之后被等的session。
alter system kill session '137,6';
第二:kill掉150,则是kill掉之前阻塞别人的session。
因此通过前面的137,6所查到的SQL语句,则是后面运行被等待的SQL语句,而不是阻塞别人的SQL语句。
如果要查找原因,操作如下:
查找相应的SQL语句:
select a.sql_text from v$sqlarea a,v$session b where a.sql_id=b.sql_id
select a.sql_text from v$sqlarea a,v$session b where a.sql_id=b.sql_id and b.event like'%TX%'

    SQL_TEXT
1 update xtdw set MC='广东电网公司中山供电局本部ok' where dh='0114'
select * from v$sqlarea where SQL_ID='gf1472pj5wnzj'
找出相应的SQL语句后,即可处理。
#######################################################################
在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁
1. 使用V$LOCK找出session持有的锁。
2. 使用V$SESSION找出持有锁或等待锁的session执行的sql语句。
3. 使用V$SESSION_WAIT找出什么原因导致session持有锁堵塞。
4. 使用V$SESSION获取关于持有锁的程序和用户的更多信息。
V$LOCK中的常用列
? SID:表示持有锁的会话信息。
? TYPE:表示锁的类型。值包括TM和TX等。
? LMODE:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。
? REQUEST:表示session请求的锁模式的信息。
? ID1,ID2:表示锁的对象标识。

1、查看相应的v$session_wait信息
    select event,count(*) from V$SESSION_WAIT group by event order by count(*) desc;
    select event,count(*) from V$SESSION_WAIT group by event order by count(*) asc;
如果如下(第3条):
    EVENT COUNT(*)
1 smon timer 1
2 Streams AQ: qmn coordinator idle wait 1
3 enq: TX - row lock contention 1
4 jobq slave wait 1
5 Streams AQ: waiting for time management or cleanup tasks 1
6 pmon timer 1
7 Streams AQ: qmn slave idle wait 1
8 SQL*Net message from client 3
9 rdbms ipc message 9

查看当前被锁的session正在执行的sql语句
select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"
from v$session a, v$lock b, v$sqltext c
where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23577591/viewspace-682546/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23577591/viewspace-682546/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值