Oracle数据库老是被锁表,而且用解锁语句解开后,紧跟着又出来一堆锁,解也解不完
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle数据库老是被锁表,而且用解锁语句解开后,紧跟着又出来一堆锁,解也解不完相关的知识,希望对你有一定的参考价值。
有啥办法一次性把一张表上的锁全部解除掉呢?
出现锁的根本解决办法不是去手动解锁啊,而是应该去看,是哪个SESSION,哪个sql语句锁的,锁了哪些资源,是不是应该锁定这些资源!
如果有些锁是不必要的,要么commit事务来释放锁,要不就不锁定这些资源!
修改应用才是应该做的!追问
问题是这个应用是对的,同一个程序运行其他程序的时候是OK的,可就是这条数据会被锁住,而且解锁好几次了,还是如此。
追答V$LOCK, V$SESSION, V$SQL, V$LOCK_OBJECT 这几个视图查啊,看看到底这条数据是被哪个应用,哪个SQL语句锁住的,加的什么锁?
参考技术A 进入oracle控制台,查看锁的产生原因和源头。可能还是程序原因,如一个事务耗时过长;或者是行级锁;或者是有其他pl/sql客户端在使用表未提交或回滚等。 参考技术B 看看是谁锁的,把这个用户kill掉追问Kill用户可不行哦,我们的ERP系统与数据库就用这个用户交互数据的。
追答那你要看看是什么锁类型了,查清楚了才好办
oracle查看锁表语句解锁方法
一、锁表查看语句
SELECT
sess.sid,
sess.serial#,
lo.oracle_username, -- 登陆账号名称
lo.os_user_name, -- 登录电脑名称
ao.object_name, -- 被锁表名
lo.locked_mode -- 死锁级别
FROM
v$locked_object lo,
dba_objects ao,
v$session sess
WHERE
ao.object_id = lo.object_id
AND lo.session_id = sess.sid;
死锁级别:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
二、解锁方法
alter system kill session '68,51'; -- 分别为SID和SERIAL#号
三、查看引起锁表的sql语句
SELECT
A.USERNAME,
A.MACHINE,
A.PROGRAM,
A.SID,
A.SERIAL#,
A.STATUS,
C.PIECE,
C.SQL_TEXT
FROM
V$SESSION A,
V$SQLTEXT C
WHERE
A.SID IN ( SELECT DISTINCT T2.SID FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID )
AND A.SQL_ADDRESS = C.ADDRESS ( + )
ORDER BY
C.PIECE;
以上是关于Oracle数据库老是被锁表,而且用解锁语句解开后,紧跟着又出来一堆锁,解也解不完的主要内容,如果未能解决你的问题,请参考以下文章