【问题标题】:Oracle how to find the blocking sqloracle如何找到阻塞的sql
【发布时间】:2020-07-10 12:43:41
【问题描述】:

我有一个 java 应用程序,它在 x 次请求后挂起。查看应用程序,它挂在对 oracle 数据库的查询执行上。检查阻塞会话using this sql 并得到这个:

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

如何找到实际的阻塞 sql?

【问题讨论】:

    标签: oracle locks


    【解决方案1】:

    它没有显示阻塞 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 实际放置了锁。

    【讨论】:

      【解决方案2】:

      在您的情况下,阻塞会话处于非活动状态,您必须查看 V$SESSION 上的 PREV_SQL_ID 以确定保持非活动状态的会话执行的最后一条 sql。

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

      问候

      【讨论】:

      • 谢谢,prev_sql是select查询,怎么会阻塞?
      • 你的意思是怎么解锁??
      • 要解锁活动会话,您需要通过 ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE 终止非活动会话
      • 任何先前在打开事务中的执行都可以阻止它。 Oracle 不存储阻塞 sql,只存储阻塞资源和阻塞器
      • 不要杀死,只是要求阻止者提交或回滚他的交易
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2017-04-25
      • 2016-07-18
      • 2015-08-06
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多