Oracle 一次 锁表 处理小记
同事说测试库上的一张表被锁了。 不能执行DML 操作。 锁表的准确说法应该是阻塞。之前的一遍blog里有说明:
http://blog.csdn.net/tianlesoftware/article/details/5822674
找多锁表的session,并kill 掉之后,对该表的DML 操作正常。 这里在模拟一次这个问题。
开2个session:
session A:
SQL>select sid from v$mystat whererownum=1;
SID
----------
137
session B:
SQL> select sid from v$mystat whererownum=1;
SID
----------
140
session A 更新表T1,不commit:
SQL> update t1 set object_id=100 where object_id=20;
2 rows updated.
session B 执行同样的操作,测试session B 会挂住:
SQL> update t1 set object_id=100 whereobject_id=20;
--在session A commit 之前,一直处于等待状态..
查看表上锁的情况:
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE (m.lmode,
0,
'None',
1,
'Null',
2,
'RowShare',
3,
'RowExcl.',
4,
'Share',
5,
'S/RowExcl.',
6,
'Exclusive',
lmode,
LTRIM (TO_CHAR (lmode, '990')))
lmode,
DECODE (m.request,
0,
'None',
1,
'Null',
2,
'RowShare',
3,
'RowExcl.',
4,
'Share',
5,
'S/RowExcl.',
6,
'Exclusive',
request,
LTRIM (TO_CHAR (m.request, '990')))
request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞
OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0 AND lmode != 4
AND (id1, id2) IN
(SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request;

这里就显示了锁的信息。 一个DML 操作需要持有2个锁。 一个3级的TM 锁和一个6级的TX锁。 TM 是共享锁,TX 是行级exclusive 锁。
查看v$lock, 可以验证以上锁的信息:
select * from v$lock where sid in (137,140);

request 是申请锁资源
block:如果是1,就代表该该SID 就持有了一个锁,并且阻塞别人获得这个锁。
2个功能类似的查询SQL:
/* Formatted on2011/8/11 14:18:13 (QP5 v5.163.1008.3004) */
SELECT p.spid,
a.sid,
a.serial#,
a.state,
c.object_name,
b.locked_mode,
b.session_id,
b.oracle_username,
b.os_user_name
FROM v$process p,
v$session a,
v$locked_object b,
all_objects c
WHERE p.addr = a.paddr
AND a.process = b.process
AND c.object_id = b.object_id;
SELECT /*+ rule */
s .username,
DECODE (l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL)
LOCK_LEVEL,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
FROM v$session s, v$lock l, dba_objects o
WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username IS NOT NULL
在session A 提交:
SQL> commit;
Commit complete.
session B 完成:
SQL> update t1 set object_id=100 whereobject_id=20;
0 rows updated.
阻塞已经结束。 如果找不到对应的session 来进行commit 操作,那就只能kill session了。
因为我这是测试库,所以也是用kill session来进行的。
SQL>alter system kill session 'sid,serial#';
转:http://blog.csdn.net/tianlesoftware/article/details/6679014
Oracle 一次 锁表 处理小记的更多相关文章
- 【oracle】处理锁表
查询锁表 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session swhe ...
- Oracle之:查询锁表,删除锁表
-- 查询当前哪个表被锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo. ...
- Oracle数据库查询锁表及解锁
一.查询哪些表被锁以及查看锁表得会话及操作系统进程ID 其中locked_mode为锁的级别,spid为数据库所在操作系统的进程id select c.sid, c.serial#, c.userna ...
- oracle 查看被锁表 及解除锁定
查看 哪些表 被锁了 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$ ...
- oracle 查看处理锁表
--查出sid,serial#select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where ...
- Oracle系列-锁表与解锁解决方案(基础版)
[Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...
- oracle解除锁表【原】
在日常操作中,经常会有不小心被锁表的情况发生 一般造成原因有: 开发人员不小心执行了 for update 查询语句后,没有解锁 不合理代码中开启事务(begin transaction)后,没有关闭 ...
- Oracle锁表查询和解锁方法
数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remov ...
- oracle锁表查询
ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 复制代码代码如下: --锁表查 ...
随机推荐
- 使用EF code first和asp.net mvc4遇到的问题总结
最近使用EF code first和asp.net mvc4做项目,遇到些问题,记录一下. 一.EF code first 生成外键列问题. 一般情况下,都是先写一个int型外键id属性,然后写一个外 ...
- soap消息机制 讲解
SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService.在使用.Net开发WebService时候, ...
- 分享: 利用Readability解决网页正文提取问题
原文:http://www.cnblogs.com/iamzyf/p/3529740.html 做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以 ...
- c# 4.0新特性一览
原文:http://www.cnblogs.com/palo/archive/2009/03/01/1400949.html 终于静下心来仔细听了一遍Anders Hejlsberg(Visual S ...
- hdu 1452 Happy 2004
因子和: 的因子是1,2,3,6; 6的因子和是 s(6)=1+2+3+6=12; 的因子是1,2,4,5,10,20; 20的因子和是 s(20)=1+2+4+5+10+20=42; 的因子是1,2 ...
- happens-before通俗理解
原文地址:http://ifeve.com/easy-happens-before/ 学习Java并发,到后面总会接触到happens-before偏序关系.初接触玩意儿简直就是不知所云,下面是经过一 ...
- 【转】Cygwin访问Windows驱动器
From:http://www.cygwin.cn/site/info/show.php?IID=1000 由于自己的项目需要使用Linux内核,所以自己在windows下安装了一个Linux虚拟机! ...
- java 写文本文件
code 1:将特定String写入特定文件,不覆盖. import java.io.*; import java.util.*; public class OutputLog { public st ...
- QAQ数论模板笔记√
#include <cstdio> using namespace std; long long gcd(long long a, long long b) { // (a, b) ret ...
- windows下编译FreeSwitch
FreeSWITCH的是一个跨平台的开源电话交换平台 windows版本:win7 64位的操作系统 [下载] 我下载的是release版本,下载的文件是freeswitch-1.4.20.zip,下 ...