1. 原因分析
出现这个问题的原因是正在执行的操作请求的资源正被其他事务锁定。即上述异常代表有事务没有提交,因为刚好有表正在被操作且被锁,因此资源还未释放,导致处理需要等待资源释放。
之后才搞清楚原来是有人对表执行了 delete 的 sql 语句,然后又突然给中断了,既没 commit 提交,也没 rollback 回滚,而导致的数据库锁表。即由于其他 Session 已经对目标表做了操作,并且已经有排他锁在表上了,所以新的 Session 无法再对表进行 DDL/MDL(除select语句外)操作。
2. 解决办法
v$locked_object 视图记录锁表相关的内容。这个视图的结果需要有锁表的情况才会出现,主要可以通过它 session_id 来关联其他表。
2.1 检查哪个用户占用资源
session_id:就是 session 会话 id。
owner:操作表的用户名
object_name :表名
根据出问题的表来找到所需要的 session_id。
select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.object_id;
2.2 利用查出来占用资源的 session_id
,查出更加详细的信息
下面的 sid
就是上面查询出来的 session_id
。这个查询将返回会话 ID、序列号、数据库用户名、操作系统用户名。
SELECT sid, serial#, username, oSUSEr,terminal,program ,action, prev_exec_startFROM v$session where sid = 143;
2.3 根据上面查出来的 sid
,serial#
杀掉占用资源的session会话
alter system kill session '143,29637';
来源地址:https://blog.csdn.net/qq_26893841/article/details/129830720