Oracle如何找到阻塞sql

Oracle如何找到阻塞sql,oracle,locks,Oracle,Locks,我有一个java应用程序,经过x次请求后,它就挂起了。看看这个应用程序,它依赖于对oracle数据库执行查询。已检查阻止会话并获取以下信息: 显然,SID 68阻塞了SID 10。但是为什么不显示阻塞sql呢?v$lock的输出显示以下锁: 如何找到实际的阻塞SQL?在您的情况下,阻塞会话处于非活动状态,您必须查看V$session上的PREV\u SQL\u ID,以确定会话执行的最后一个仍处于非活动状态的SQL V$LOCK列出Oracle数据库当前持有的锁以及未完成的锁或闩锁请求。Or

我有一个java应用程序,经过x次请求后,它就挂起了。看看这个应用程序,它依赖于对oracle数据库执行查询。已检查阻止会话并获取以下信息:

显然,SID 68阻塞了SID 10。但是为什么不显示阻塞sql呢?
v$lock
的输出显示以下锁:


如何找到实际的阻塞SQL?

在您的情况下,阻塞会话处于非活动状态,您必须查看V$session上的PREV\u SQL\u ID,以确定会话执行的最后一个仍处于非活动状态的SQL

V$LOCK列出Oracle数据库当前持有的锁以及未完成的锁或闩锁请求。Oracle中有许多类型的锁,这就是为什么在该视图中有这么多行的原因


关于

它没有显示阻塞SQL语句的原因是因为这是未知的

考虑以下情况: 会话1-“选择更新…”。。。其中EMP_ID='123'(因此锁定该行) 会话1-…其他一些SQL(仍然没有提交) 会话1-…其他一些SQL(仍然没有提交) 会话1-…其他一些SQL(仍然没有提交) 会话1-…其他一些SQL(仍然没有提交)

会话2-“选择更新…其中EMP_ID=”123“(被会话1阻止,会话1仍然没有提交,因此仍然保持锁定)


因此,我们可以知道会话1是阻塞会话,但没有任何视图表明实际锁定的是当前sql之前的sql 3。

谢谢,上一个sql是选择查询,它如何阻止?您的意思是如何解锁?要解锁活动会话,您需要立即通过更改系统终止会话“SID,SERIAL#”来终止非活动会话open transaction中以前的任何执行都可以阻止它。Oracle不存储阻塞sql,只存储阻塞的资源和blockerDon不杀死,只要求阻止程序提交或回滚其事务