同事说测试库上的一张表被锁了。 不能执行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. 【WCF--初入江湖】11 安全

    11 安全 前言 [1]传输安全  传输安全模式  传输安全与绑定协议   [2]身份验证  身份验证分类  证书  示例:传输安全匿名客户端证书的使用 1. 传输安全     保证信息在传输过程中的 ...

  2. 自定义nagios check_load告警阀值

    自定义nagios  check_load告警阀值 日期:2012-01-11 来源: heipark 分享至: - 默认check_load配置 define service{ use generi ...

  3. SQL事物用法【转】

    SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为 ...

  4. [Browsable(false)]

    1.c#方法上面的[Browsable(false)]是干吗用的? 答案:标明此对象不可被浏览,这样它就不会出现在设计器的属性窗口里了 看如下代码: /// <include file='Asp ...

  5. Spark安装部署

    原创文章,转载请注明: 转载自www.cnblogs.com/tovin/p/3820979.html 一.系统环境配置 参照http://www.cnblogs.com/tovin/p/381890 ...

  6. Android中JSON数据格式的简单使用

    源码: package com.wangzhu.demo; import java.io.BufferedReader; import java.io.IOException; import java ...

  7. Linux中断处理体系结构分析

    Linux中断处理体系结构分析(一) 异常,就是可以打断CPU正常运行流程的一些事情,比如外部中断.未定义指令.试图修改只读的数据.执行swi指令(Software Interrupt Instruc ...

  8. Xamarin.Android 入门之:Listview和adapter

    一.引言 不管开发什么软件,列表的使用是必不可少的,而本章我们将学习如何使用Xamarin去实现它,以及如何使用自定义适配器.关于xamarin中listview的基础和适配器可以查看官网https: ...

  9. QC、IQC、IPQC、FQC、OQC

    品质政策为:全面品管.贯彻制度.提供客户需求的品质:全员参与.及时处理.以达成零缺点的目标. 品质三不政策为:不接受不良品.不制造不良品.不流出不良品. QC即英文QUALITY CONTROL的简称 ...

  10. 2014-9-17二班----6 web project

    部署  加载 到 Tomcat 6.0 服务器上 web.xml           <welcome>index.jsp </welcome>   <welcome&g ...