oracle怎么看锁等待,oracle锁等待超时

如何快速查出 oracle 数据库中的锁等待

用如下语句:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网络空间、营销软件、网站建设、滁州网站维护、网站推广。

select a.username, a.sid, a.serial#, b.id1

from v$session a, v$lock b

where a.lockwait = b.kaddr;

如果存在锁等待,查询后有结果,反之则无结果:

oracle 死锁和锁等待的区别

死锁指的是a,b两个事务对同一对象进行dml或ddl操作(即修改表结构或者增删改数据),出现了相互等待被锁定的对象的情况,即类似于红绿灯十字路口红灯方向堵住路口,绿灯方向却红灯车辆挡在路口不能过去,这样无论红绿灯如何变化都无法通行。一般像oracle这样的dbms是有死锁检测的,然后把锁定对象抛出来按照预定规则处理或者让程序处理。

锁等待指的是a事务锁定了操作对象,而b事务也要对其进行dml或ddl操作(即修改表结构或者增删改数据)时,需要等待a事务完成。这个和死锁不同,只要a事务完成后,b事务就可以正常进行了。类似于正常的红绿灯十字路口通行状态:红灯方向就是等待锁释放的b事务,绿灯方向就是锁定路口的a事务。待红绿灯互换,则a事务执行完毕,b事务也就可以正常执行啦。

oracle 怎么查看数据被锁

1.创建测试表,如下图。

createtabletest_lock(idnumber,valuevarchar2(200));

2.执行append语句;并且不做提交,insert/*+append*/intotest_lockvalues(1,1)如下图。

3.再次执行清表语句,truncatetabletest_lock;报锁表错误,如下图。

4.查看锁表语句,发现被锁表

selectb.object_name,t.*

fromv$locked_objectt,user_objectsb

wheret.object_id=b.object_id

注意事项:

简化数据:可以将复杂的查询创建为其他人可以使用的视图,而不必了解复杂的业务或逻辑关系。这简化并掩盖了视图用户数据的复杂性。

表结构设计的补充:在设计的系统才刚刚开始,大部分的程序直接访问数据表结构,但是随着业务的变化,系统更新,等等,引起了一些表结构不适用,这次修改系统的表结构太大,开发成本较高的影响。

这个时候可以创建一个视图来补充表结构设计,降低开发成本。程序可以通过查询视图直接获得它想要的数据。

添加安全性:视图可以向用户显示表中的指定字段,而不是向用户显示表中的所有字段。在实际开发中,视图通常作为提供数据的一种方式提供,并将只读权限提供给第三方以供查询使用。

oracle查询锁表与解锁情况提供解决方案

如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待

以下的语句可以查询到谁锁了表:

复制代码

代码如下:

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

以下的语句可以查询到谁在等待:

复制代码

代码如下:

SELECT

/*+

rule

*/

lpad('

',decode(l.xidusn

,0,3,0))||l.oracle_username

User_name,

o.owner,o.object_name,o.object_type,s.sid,s.serial#

FROM

v$locked_object

l,dba_objects

o,v$session

s

WHERE

l.object_id=o.object_id

AND

l.session_id=s.sid

ORDER

BY

o.object_id,xidusn

DESC

解锁命令:

复制代码

代码如下:

alter

system

kill

session

'sid,serial#'

1).

复制代码

代码如下:

select

LOCK_INFO.OWNER

||

'.'

||

LOCK_INFO.OBJ_NAME

as

"已锁物件名称",

--物件名称(已经被锁住)

LOCK_INFO.SUBOBJ_NAME

as

"已锁子物件名称",

--

子物件名称(已经被锁住)

SESS_INFO.MACHINE

as

"机器名称",

--

机器名称

LOCK_INFO.SESSION_ID

as

"会话ID",

--

会话SESSION_ID

SESS_INFO.SERIAL#

as

"会话SERIAL#",

--

会话SERIAL#

SESS_INFO.SPID

as

"OS系统的SPID",

--

OS系统的SPID

(SELECT

INSTANCE_NAME

FROM

V$INSTANCE)

"实例名SID",

--实例名SID

LOCK_INFO.ORA_USERNAME

as

"ORACLE用户",

--

ORACLE系统用户名称

LOCK_INFO.OS_USERNAME

as

"OS用户",

--

作业系统用户名称

LOCK_INFO.PROCESS

as

"进程编号",

--

进程编号

LOCK_INFO.OBJ_ID

as

"对象ID",

--

对象ID

LOCK_INFO.OBJ_TYPE

as

"对象类型",

--

对象类型

SESS_INFO.LOGON_TIME

as

"登录时间",

--

登录时间

SESS_INFO.PROGRAM

as

"程式名称",

--

程式名称

SESS_INFO.STATUS

as

"会话状态",

--

会话状态

SESS_INFO.LOCKWAIT

as

"等待锁",

--

等待锁

SESS_INFO.ACTION

as

"动作",

--

动作

SESS_INFO.CLIENT_INFO

as

"客户资讯"

--

客户资讯

from

(select

obj.OWNER

as

OWNER,

obj.OBJECT_NAME

as

OBJ_NAME,

obj.SUBOBJECT_NAME

as

SUBOBJ_NAME,

obj.OBJECT_ID

as

OBJ_ID,

obj.OBJECT_TYPE

as

OBJ_TYPE,

lock_obj.SESSION_ID

as

SESSION_ID,

lock_obj.ORACLE_USERNAME

as

ORA_USERNAME,

lock_obj.OS_USER_NAME

as

OS_USERNAME,

lock_obj.PROCESS

as

PROCESS

from

(select

*

from

all_objects

where

object_id

in

(select

object_id

from

v$locked_object))

obj,

v$locked_object

lock_obj

where

obj.object_id

=

lock_obj.object_id)

LOCK_INFO,

(select

SID,

SERIAL#,

LOCKWAIT,

STATUS,

(select

spid

from

v$process

where

addr

=

a.paddr)

spid,

PROGRAM,

ACTION,

CLIENT_INFO,

LOGON_TIME,

MACHINE

from

v$session

a)

SESS_INFO

where

LOCK_INFO.SESSION_ID

=

SESS_INFO.SID

order

by

LOCK_INFO.SESSION_ID;

2).

复制代码

代码如下:

select

sql_text

from

v$sqltext

where

address

in

(select

sql_address

from

v$session

where

sid

=

sid)

order

by

piece;

3).

复制代码

代码如下:

ALTER

SYSTEM

KILL

SESSION

'会话ID,会话SERIAL#';

4).

kill

-9

OS系统的SPID

ORACLE怎么查看等待关系?

锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等

以下的语句可以查询到谁锁了表,而谁在等待。

SELECT /*+ rule */

lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,

o.owner,

o.object_name,

o.object_type,

s.sid,

s.serial#

FROM v$locked_object l, dba_objects o, v$session s

WHERE l.object_id = o.object_id

AND l.session_id = s.sid

ORDER BY o.object_id, xidusn DESC

以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道

锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn 就是回滚段的USN

如何检查oracle死锁

oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看。 一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、oracle死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。 三、oracle死锁的定位方法 通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。 1)用dba用户执行以下语句 以下是代码片段: select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) 如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明: Username:死锁语句所用的数据库用户; Lockwait:死锁的状态,如果有内容表示被死锁。 Status: 状态,active表示被死锁 Machine: 死锁语句所在的机器。 Program: 产生死锁的语句主要来自哪个应用程序。 2)用dba用户执行以下语句,可以查看到被死锁的语句。 以下是代码片段:


本文题目:oracle怎么看锁等待,oracle锁等待超时
文章源于:http://scyanting.com/article/dscssje.html