暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何获取会话阻止的SQL文本以及哪个会话阻止了它

askTom 2017-03-02
254

问题描述

我试图找到方法来获取阻止和阻止会话的SQL文本。我无法做到。V $ SESSION包含当前正在执行的SQL ID或仅上一个SQL ID。但是阻止另一个会话的会话可能会在阻止SQL执行后发出多个sql调用。有什么方法可以同时获取两个sql文本?

我试过下面的例子

创建表D (x int)

插入d值 (1)
插入d值 (2)

Session-1-我在下面运行更新查询
更新D集X = 10,其中X = 2;

Session-2-我在同一更新查询下运行
更新D集X = 15,其中X = 2;

它被挡住了。

没有提交。

专家解答

你不能真正得到 * 导致 * 块的SQL文本,因为与 * 当前 * 被阻止的人不同,不能保证锁定行的会话正在运行任何东西。

他们可能在两天前运行了 “更新D集X = 10,其中X = 2”,并且从那以后一直闲置在那里。另外,没有可能导致问题的 “一个” SQL。该会议可能已经完成:

更新D集X = 10,其中X = 2;

然后

更新D组X = 15

然后

更新D组X = 1
其中不存在 (从emp中选择null,其中empno = d.x)

所有这些都将更新/锁定x = 2的行

v $ session会告诉您blocking_session_id,它为您提供了杀死会话的信息 (或者打电话给这样做的人!)。此外,您可以使用资源管理器自动杀死一个空闲但正在阻止其他会话的会话。

https://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN027


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论