2009-05-05 33 views
1

我有一个查询编辑器(Toad)正在查看数据库。有没有办法窥视另一个Oracle会话?

同时,我也在用自己的单独连接调试应用程序。

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

目前,我通过将查询输出从应用程序转储到文本文件并读取该文件来解决此问题。

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

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

回答

0

您是否可以暂时将您希望达到的会话的隔离级别设置为'使用alter session命令或登录触发器'读取未提交'?

我喜欢做什么(一般)是在留在那里永久码处调试语句,但在生产被关闭汤姆 - 凯特的debug.f包开始有用的地方 - http://asktom.oracle.com/tkyte/debugf

+0

Oracle没有读取未提交隔离级别。 http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/consist.htm#CNCPT1326 – 2009-05-06 14:09:08

2

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

但是一般来说,最好的选择是包含您自己的调试信息,您可以根据需要轻松开启和关闭。

1

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

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

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

类似的故事存在更新或任何会导致违反唯一约束。

相关问题