同事说测试库上的一张表被锁了。 不能执行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. unity3d 射线扫描 忽略图层

    原地址:http://blog.csdn.net/w88193363/article/details/38331205 函数说明 static RaycastHit2D[] RaycastAll(Ve ...

  2. PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)

    定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号.在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: 1 2 3 4 5 6 7 8 < ...

  3. SDUT2241计算组合数C(n,m)(组合数)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2241 这个题的代码适应性也挺强,但这个题倒不适 ...

  4. Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理

    1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...

  5. codeforces div.1 A

    A. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. N皇后//搜索入门

    P1080 N皇后 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条 ...

  7. Codeforces D546:Soldier and Number Game

    题目链接 输入t对数 a, b 求(b,a]内的每个数拆成素因子的个数和 这里每个数都可以写成素数的乘积,可以写成几个素数的和就有几个素因子,这里求的是(b,a]内的素因子和 思路: 素数的素因子个数 ...

  8. Swift入门(十一)——类型转换与is、as操作

    三种操作:is.as?和as! Swift是强类型语言,但也允许开发者通过is.as?和as!这三种操作来对类型进行判断和强制转换.其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强 ...

  9. Xamarin.Android 入门之:Bind java的jar文件+Android显示gif图片

    一.引言 在xamarin开发的时候,有时我们想要做一个功能,但是这个功能已经有人用java写好了,并且打包成了jar文件.那么我们可以直接把对方的jar文件拿过来用而不是重新用c#写代码. 关于bi ...

  10. python 时间处理(time和datetime介绍)

    python的有关时间的有哪几种呢?今天我们介绍两个:time和datetime time模块提供各种操作时间的函数 datetime模块定义了下面这几个类: datetime.date:表示日期的类 ...