【问题标题】:Is there a way to peek inside of another Oracle session?有没有办法窥探另一个 Oracle 会话的内部?
【发布时间】:2010-10-23 22:16:18
【问题描述】:

我有一个查询编辑器 (Toad) 正在查看数据库。

同时,我也在调试一个有自己独立连接的应用程序。

我的应用程序启动一个事务,进行一些更新,然后根据一些 SELECT 语句做出决定。由于尚未提交更新语句(很多且复杂),因此我的应用程序从其 SELECT 中获得的结果与我在 Toad 中运行相同语句时获得的结果不同。

目前我通过将应用程序的查询输出转储到文本文件中并读取它来解决这个问题。

有没有更好的方法可以在提交完成之前窥探另一个 oracle 会话,并查看该会话看到的内容?

问这个问题的另一种方式是:在Oracle下,我可以只在两个会话之间启用dirty reads,而不影响其他人的会话吗?

【问题讨论】:

    标签: oracle isolation-level


    【解决方案1】:

    不,Oracle 不允许脏读。此外,由于更改可能尚未物理写入磁盘,因此您不会在数据文件中找到它们。 日志写入器将至少每三秒写入一次任何待处理的数据更改,因此您可以使用 Log Miner 的东西从那里挑选出来。

    但总的来说,最好的办法是包含您自己的调试信息,您可以根据需要轻松打开和关闭这些信息。

    【讨论】:

      【解决方案2】:

      我知道这不是一个完整的答案,但是虽然没有死读,但有一些锁可以让您了解发生了什么。

      如果您在会话 1 中插入主键为 7 的行,那么当您从会话 2 中选择时将看不到它。(那将是脏读)。

      但是,如果您尝试使用主键 7 从会话 2 插入,那么它将阻塞在会话 1 后面,因为它必须等待并查看会话 1 是否会提交或回滚。您可以使用“WAIT 10”等待 10 秒以使这发生。

      对于更新或任何会导致违反唯一约束的事情也存在类似的情况。

      【讨论】:

        【解决方案3】:

        您能否暂时使用更改会话命令或登录触发器(我自己没有尝试过)将要达到峰值的会话中的隔离级别设置为“读取未提交”?

        我更喜欢做的(通常)是在代码中放置调试语句,这些语句永久保留在那里,但在生产中被关闭 - Tom Kyte 的 debug.f 包是一个有用的起点 - http://asktom.oracle.com/tkyte/debugf

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多