❶ ORACLE 如何查询被锁定表及如何解锁释放session
ORACLE
EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作
复制代码
代码如下:--锁表查询sqlSELECT
object_name,
machine,
s.sid,
s.serial#
FROM
gv$locked_object
l,
dba_objects
o,
gv$session
s
WHERE
l.object_id
=
o.object_id
AND
l.session_id
=
s.sid;
找到被锁定的表,解锁
复制代码
代码如下:--释放SESSION
SQL:
--alter
system
kill
session
'sid,
serial#';
您可能感兴趣的文章:mysql
事务处理及表锁定深入简析
❷ oracle_capacity锁怎么查
1.以下代码可以查看是否被锁表:
2selecta.object_name,b.session_id,c.serial#,c.program,c.username,c.command,c.machine,c.lockwait
3fromall_objectsa,v$locked_objectb,v$sessioncwherea.object_id=b.object_idandc.sid=b.session_id;
4
2.查询锁表原因:
5selectl.session_idsid,
6s.serial#,
7l.locked_mode,
8l.oracle_username,
9s.user#,
10l.os_user_name,
11s.machine,
12s.terminal,
13a.sql_text,
14a.action
153.接上:
16fromv$sqlareaa,v$sessions,v$locked_objectl
17wherel.session_id=s.sid
18ands.prev_sql_addr=a.address
19orderbysid,s.serial#;
204.解锁方法:altersystemkillsession’146′;–146为锁住的进程号,即spid。
215.查看被锁的表:selectp.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_namefromv$processp,v$sessiona,v$locked_objectb,all_objectscwherep.addr=a.paddranda.process=b.processandc.object_id=b.object_id
226.以上就是oracle查看锁表的方法,以及一些相关信息,看过之后如果觉得有帮助可以在下面给点个赞~
❸ oracle中如何查询表被锁定状态
SELECTobject_name,machine,s.sid,s.serial#
FROMgv$locked_objectl,dba_objectso,gv$sessions
WHEREl.object_id=o.object_id
ANDl.session_id=s.sid;
如果没有结果就是没有被锁定的,如果查询有结果,就说明此表被锁了。如图:
❹ oracle数据库锁表怎么解决
首先你要知道表锁住了是不是正常锁?因为任何DML语句都会对表加锁。
你要先查一下是那个会话那个sql锁住了表,有可能这是正常业务需求,不建议随便KILL session,如果这个锁表是正常业务你把session kill掉了会影响业务的。
建议先查原因再做决定。
(1)锁表查询的代码有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪个表被锁
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)查看是哪个sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;
(5)杀掉对应进程
执行命令:alter system kill session'1025,41';
其中1025为sid,41为serial#.
❺ 平时使用oracle时,为什么会锁表
数据库事务及隔离级别
隔离级别:脏读、幻读、一致读、不可重复读、更新丢失
1.脏读(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚
2.幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的
3.不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交
4.两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效
5.更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开
20、锁是什么?
锁:在所有的DBMS(数据库管理系统)中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
锁分为行级锁和表锁。
行级锁:主要是在执行操作过程中,锁定指定的行。
主要的锁行语句有:insert ,update,delete ,及select ....for update。
表锁:指在运行操作指令过程中,由用户指定锁定某张表。lock table XXX in mode share;
共享锁,排他锁,共享排它,行共享,行排他。
锁模式包括?
共享锁:(读取)操作创建的锁。其他用户可以并发读取数据,但任何事物都不能获取数据上的排它锁,直到已释放所有共享锁。
排他锁(X锁):对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
更新锁:更新 (U) 锁可以防止通常形式的死锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则两个事务需都要转换共享锁为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
若要避免这种潜 在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。
锁的粒度主要有以下几种类型:
行锁: 粒度最小,并发性最高
页锁:一次锁定一页。25个行锁可升级为一个页锁。
表锁:粒度大,并发性低
数据库锁:控制整个数据库操作
乐观锁:乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。一般的实现乐观锁的方式就是记录数据版本。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。
20、数据库的乐观锁和悲观锁是什么? oracle 是行级锁
数据库管理系统(DBMS)中,并发控制的任务是:确保在多个事务同时存取同一数据时,不破坏事务的隔离性和统一性以及数据库的统一性。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
21、悲观锁和乐观锁的区别,怎么实现
悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。
乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作。
❻ oracle 怎么查看数据被锁
1.创建测试表,如下图。
createtabletest_lock(idnumber,valuevarchar2(200));
注意事项:
简化数据:可以将复杂的查询创建为其他人可以使用的视图,而不必了解复杂的业务或逻辑关系。这简化并掩盖了视图用户数据的复杂性。
表结构设计的补充:在设计的系统才刚刚开始,大部分的程序直接访问数据表结构,但是随着业务的变化,系统更新,等等,引起了一些表结构不适用,这次修改系统的表结构太大,开发成本较高的影响。
这个时候可以创建一个视图来补充表结构设计,降低开发成本。程序可以通过查询视图直接获得它想要的数据。
添加安全性:视图可以向用户显示表中的指定字段,而不是向用户显示表中的所有字段。在实际开发中,视图通常作为提供数据的一种方式提供,并将只读权限提供给第三方以供查询使用。
❼ oracle 锁表如何查看
通过以下语句查询
SELECT
'alter system kill session '''||c.sid||','|| c.SERIAL#||',@'|| c.inst_id||'''' ,
c.INST_ID,
c.pADDR,
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME,--锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.V_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS --AND C.STATUS='ACTIVE'
ORDER BY 1,2
❽ 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.xisn
,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,xisn
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 锁表时,怎么查出是哪些SQL语句导致了锁表
SELECT /*+ rule */ lpad(' ',decode(l.xisn ,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,xisn DESC
执行此SQL即可,结果一看便知,适用于oracle, 其他不解释~
❿ 查看oracle是否锁表
Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容。
(1)锁表查询的代码有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪个表被锁
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)杀掉对应进程
执行命令:alter system kill session'1025,41';
其中1025为sid,41为serial#.