我有一个查询编辑器(Toad)查看数据库。
同时,我也在使用自己独立的连接调试应用程序。
我的应用程序启动事务,执行一些更新,然后根据某些SELECT语句做出决策。因为更新语句(很多很复杂)还没有提交,所以我的应用程序从SELECT获取的结果与我在Toad中运行相同语句时获得的结果不同。
目前我通过将应用程序的查询输出转储到文本文件中并阅读它来解决这个问题。
有没有更好的方法来查看另一个oracle会话,并在提交完成之前查看该会话看到了什么?
另一种问题是:在Oracle下,我是否可以仅在两个会话之间启用dirty reads,而不会影响其他人的会话?
答案 0 :(得分:2)
不,Oracle不允许脏读。此外,由于更改可能尚未实际写入磁盘,因此您无法在数据文件中找到它们。 日志编写器将至少每三秒写一次挂起的数据更改,这样您就可以使用Log Miner的东西从那里取出它。
但总的来说,您最好的选择是包含您自己的调试信息,您可以根据需要轻松打开和关闭这些信息。
答案 1 :(得分:1)
我知道这不是一个完整的答案,但是虽然没有死读,但有锁可以让你知道发生了什么。
在会话1中,如果您插入一个带有主键7的行,那么当您从会话2中选择时,您将看不到它。(这将是一个脏读)。
但是,如果您尝试使用主键7从会话2插入,那么它将阻塞会话1,因为它必须等待并查看会话1是否提交或回滚。您可以使用“等待10”等待10秒钟。
类似的故事存在更新或任何会导致唯一约束违规的内容。
答案 2 :(得分:0)
您是否可以暂时使用alter session命令或登录触发器(我自己没有尝试过)将您想要达到峰值的会话中的隔离级别设置为“read uncommitted”?
我喜欢做的(一般情况下)是将代码中的调试语句永久保留在那里但在生产中关闭 - Tom Kyte的debug.f包是一个有用的起点 - http://asktom.oracle.com/tkyte/debugf < / p>