2011-06-03 77 views
1

我的應用程序可以從故障中自動恢復。我測試如下:Oracle ALTER SESSION ADVIS COMMIT?

  1. 開始應用
  2. 在處理過程中,殺死應用程序服務器主機(關機-r -f)
  3. 在主機重新啓動,應用程序服務器重新啓動(作爲一個窗口服務)
  4. 應用程序重新啓動
  5. 應用程序嘗試進​​行處理,但被來自以前會話的Oracle DB中未完成的兩階段提交事務阻止。
  6. 在10到30分鐘之後,DB會解析先前的txn,並且處理繼續正常。

我需要它來繼續處理比這更快。我的DBA建議,我得先聲明我的發言與

ALTER SESSION ADVISE COMMIT; 

但他不能給我保證或細節有關數據丟失這樣的潛力。

幸運的是,該聲明只是簡單地將datetime的值更新爲SYSDATE,因此如果發生一些數據損壞,它會在覆蓋前1秒鐘持續<。

但是,對我的問題。上述聲明究竟做了什麼? Oracle在使用時如何解決數據同步問題?

回答

2

您能否在您的方案中闡明「本地」和「遠程」數據庫的作用?

一般一個multi-db transaction執行下列操作

  1. 啓動事務
  2. 使上改變數據庫
  3. 使得其他數據庫上的改變
  4. 獲取其他數據庫「的承諾,承諾'
  5. 本地提交
  6. 獲取遠程數據庫提交

如果步驟4完成後出現問題,交易將會發生。一般的做法是讓遠程數據庫備份並確認它是否提交。如果是這樣,步驟(5)繼續。如果事務的遠程組件不能被提交,則本地組件被回滾。

你的描述似乎指的是一個應用程序服務器失敗,這是一個不同的水壺。在你的情況,我認爲情況如下:

  1. 應用服務器需要一個連接,並沒有提交
  2. 應用程序服務器重新啓動啓動事務
  3. 應用程序服務器死了,做一個新的數據庫連接
  4. 應用程序服務器在新連接上啓動新的交易
  5. 新交易「卡住」等待舊連接/交易所持有的鎖
  6. 20分鐘後,死連接終止並且tra nsaction回滾
  7. 新事務然後繼續

在這種情況下,溶液被扼殺了舊連接更快,用更短的超時(例如SQLNET_EXPIRE_TIME在服務器的sqlnet.ora中)或手動ALTER系統殺死會話。

相關問題