同事说测试库上的一张表被锁了。 不能执行DML 操作。 锁表的准确说法应该是阻塞。之前的一遍blog里有说明:

锁 死锁 阻塞Latch 等待 详解

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 一次 锁表 处理小记的更多相关文章

  1. 【oracle】处理锁表

    查询锁表 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session swhe ...

  2. Oracle之:查询锁表,删除锁表

    -- 查询当前哪个表被锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo. ...

  3. Oracle数据库查询锁表及解锁

    一.查询哪些表被锁以及查看锁表得会话及操作系统进程ID 其中locked_mode为锁的级别,spid为数据库所在操作系统的进程id select c.sid, c.serial#, c.userna ...

  4. oracle 查看被锁表 及解除锁定

    查看 哪些表 被锁了 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$ ...

  5. oracle 查看处理锁表

    --查出sid,serial#select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where ...

  6. Oracle系列-锁表与解锁解决方案(基础版)

    [Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...

  7. oracle解除锁表【原】

    在日常操作中,经常会有不小心被锁表的情况发生 一般造成原因有: 开发人员不小心执行了 for update 查询语句后,没有解锁 不合理代码中开启事务(begin transaction)后,没有关闭 ...

  8. Oracle锁表查询和解锁方法

    数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remov ...

  9. oracle锁表查询

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 复制代码代码如下: --锁表查 ...

随机推荐

  1. 一个简单的PHP登录演示(SESSION版 与 COOKIE版)

    //==============COOKIE版本的简单登录================ if ($_GET[out]){ setcookie('id',''); setcookie('pw','' ...

  2. uva 10160

    一开始写的代码加上各种剪枝后还是超时, 然后看了一下状态压缩后过了,两个代码的具体思想是一样的,状态压缩后可以大大提升性能 #include <cstdio> #include <c ...

  3. jquery css 简单笔记

    内容 要点:清空表单中所有数据,除去 button,submit,reset,hidden 的数据 $(':input','#myform') .not(':button, :submit, :res ...

  4. sql server2012 动态端口

    我们查询  exec sp_readerrorlog 0, 1, "listening" 时可以看有端口监听,有1433 1434 53698等. 这时我们可以打看配置管理器,查看 ...

  5. Appium —— desired_capabilities详解

    Appium 服务关键字 关键字 描述 实例 automationName 你想使用的自动化测试引擎 Appium (默认) 或 Selendroid platformName 你要测试的手机操作系统 ...

  6. CentOS中基于不同版本安装重复包的解决方案

    http://blog.chinaunix.net/uid-21710705-id-3039675.html

  7. POJ1789Truck History

    题意 : 说实话,题意我没看懂,后来让人给我讲的样例..... 4 aaaaaaa baaaaaa abaaaaa aabaaaa 0 这个样例的话,就是输入n下面n行,每行7个字母,让你依次选两行进 ...

  8. 【PSR规范专题(1)】PSR-0+namespace+spl_autoload_register实现框架模型

    了解命名空间 namespace是PHP5.3版本加入的新特性,用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/ ...

  9. Entity Framework: Get mapped table name from an entity

    The extension methods I have created one extension method for DbContext and other for ObjectContext: ...

  10. ConcurrentHashMap使用示例

    ConcurrentHashMap使用示例 发表于2年前(2013-07-12 19:05)   阅读(3660) | 评论(0) 25人收藏此文章, 我要收藏 赞5 如何快速提高你的薪资?-实力拍“ ...