2009-05-05 73 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秒鐘發生。

類似的故事存在更新或任何會導致違反唯一約束。