【发布时间】:2020-07-10 12:43:41
【问题描述】:
我有一个 java 应用程序,它在 x 次请求后挂起。查看应用程序,它挂在对 oracle 数据库的查询执行上。检查阻塞会话using this sql 并得到这个:
显然 SID 68 阻塞了 SID 10。但是为什么它不显示阻塞的 sql 呢? v$lock 的输出显示以下锁:
如何找到实际的阻塞 sql?
【问题讨论】:
我有一个 java 应用程序,它在 x 次请求后挂起。查看应用程序,它挂在对 oracle 数据库的查询执行上。检查阻塞会话using this sql 并得到这个:
显然 SID 68 阻塞了 SID 10。但是为什么它不显示阻塞的 sql 呢? v$lock 的输出显示以下锁:
如何找到实际的阻塞 sql?
【问题讨论】:
它没有显示阻塞 SQL 语句的原因是因为这是未知的。
考虑这种情况: 会话 1 - 'SELECT FOR UPDATE ... WHERE EMP_ID = '123" (从而锁定该行) SESSION 1 - .... 其他一些 SQL(仍未提交) 会话 1 - .... 其他一些 SQL(仍未提交) 会话 1 - .... 其他一些 SQL(仍未提交) 会话 1 - .... 其他一些 SQL(仍未提交)
会话 2 - 'SELECT FOR UPDATE ... WHERE EMP_ID = '123"(被会话 1 阻塞,_仍然没有提交,所以仍然持有它的锁)
因此,我们可以知道会话 1 是阻塞会话,但没有任何视图表明它是当前 sql 之前的 sql 3 实际放置了锁。
【讨论】:
在您的情况下,阻塞会话处于非活动状态,您必须查看 V$SESSION 上的 PREV_SQL_ID 以确定保持非活动状态的会话执行的最后一条 sql。
V$LOCK 列出了 Oracle 数据库当前持有的锁以及未完成的锁或闩锁请求。 Oracle 中有许多类型的锁,这就是为什么您在该视图上有这么多行的原因。
问候
【讨论】: