2011-06-27 202 views
0

我在開發系統時遇到了一些問題。我有一個python腳本,它首先與一個virtulisation軟件一起工作,如果這個操作成功了,它將把事情寫入數據庫。 如果在虛擬化軟件中發生了一些異常,我可以管理所有東西,但是如果在數據庫中插入失敗,則會出現真正的問題。如果插入失敗,我將不得不在該虛擬化軟件中還原事物,否則事情將變爲異步。但問題是,在軟件中恢復的東西是不可能的。數據庫同步

如何處理事情,以便我可以保持數據庫與該軟件同步?任何中間件或特殊應用程序?或編程中的任何邏輯?

回答

1

您希望系統中的兩個操作(OP:操作在您的virt軟件中; WDB:寫入數據庫)爲原子操作(兩者都發生,或者都不發生)。一種分佈式事務,但是您的虛擬化軟件不直接支持可交易行爲(不回滾)。如果你可以讓它們成爲一些分佈式事務系統的一部分,你就完成了(見eg),但這通常是不可能或不切實際的。獲得僞交易行爲的不同策略取決於您的場景的具體情況。一些例子:


  1. 打開TX(DB中的交易)
  2. WDB
  3. OP
  4. 如果OP完成,提交TX,否則回滾TX。

只有寫入數據庫的內容不依賴於OP操作(不太可能)纔可行。


  1. OP1(操作的第一階段:你得到的結果,但不改變任何東西)
  2. 打開TX
  3. WDB
  4. OP2(第二階段:您修改的virt。 sofware)
  5. 提交TX或回滾

(步驟4-5可切換)這將是一個口服或者是人的「兩階段提交」實現。只有在這兩個階段你才能分開你的手術。


  1. 打開TX
  2. 假人WDB(寫入虛設結果DB)
  3. 回滾TX
  4. OP
  5. WDB

這會檢查DB是可操作,在嘗試真正的操作和寫作之前做一個虛擬的寫作。可行,但不是萬無一失。


  1. OP
  2. WDB
  3. 如果失敗:將數據保存到原始文件,日誌錯誤,發送郵件到IT,就變成紅燈。

聲音可憐......但有時這是唯一可行的辦法。

+0

不錯的答案..我會選擇倒數第二.. – adityap