1

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

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

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

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

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

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

4

3 回答 3

2

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

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

于 2009-05-05T22:25:25.227 回答
1

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

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

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

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

于 2009-05-06T02:32:30.063 回答
0

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

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

于 2009-05-05T20:48:06.490 回答