2013-04-09 20 views
0

當我說「軟」事務時,我的意思是不涉及某些數據庫中的持久性,而只是邏輯對象修改。這是故事。在Java中回滾「軟」事務的方法

普通JAVA應用程序,沒有框架,可能很多線程。

  1. 對象,在他的單獨的線程,開始DoSomething的()。在doSomething()中,這個對象成員和(可能)其他對象被修改。
  2. Ob的線程被一些事件處理程序中斷。有人想Ob to doSomethingElse()而不是doSomething()!
  3. Ob完成doSomething()並檢查他的線程是否被中斷。如果是的話,我想他:
    一)完全撤消(回滾)DoSomething的(),
    B)doSomethingElse()

,而無需微量元素DoSomething的提出任何具體變化() ,也因爲我可以爲每個對象有許多不同的doSomething方法。我沒有使用特定的框架,我想保持它「輕」,說。

有沒有辦法實現這樣的行爲?
非常感謝!

+0

我不確定,但那可能需要有對象的防禦副本,以在編輯之前保存狀態。 – 2013-04-09 12:20:01

+0

但是有一件事只是點了我,環境是多線程的。所以如果你試圖將對象恢復到以前的狀態,而另一個線程成功地改變了狀態,那麼該怎麼辦呢? – 2013-04-09 12:28:39

回答

2

是的,這樣的功能是可能的,並且經常用於例如, ORM框架或servlet容器中。 ORM框架通常提供某種實體緩存,其中存儲了預填充的Java對象。對這些對象的修改必須與數據庫事務同步。一些servlet容器也提供對HTTP會話的事務訪問。例如。請求期間的修改應用於會話的副本,並且只有在請求成功或以其他方式丟棄時纔會被永久應用。

通常,此類功能基於在啓動事務時製作狀態的副本,在事務期間處理副本並在提交事務時用修改的副本替換永久狀態,如果事務分別丟棄副本被回滾。您可能還需要其他功能來檢查甚至禁止同時修改。

由於在Java中沒有「標準」的方式,使一個對象的副本,你必須做一些工作,自己有幾種可能的方法:

  • 實施Cloneable,但要確保克隆方法返回對象的深層副本,而不是默認的淺拷貝(出站引用只是「移動」到新對象,而不是製作引用對象的實際副本)。
  • 使用序列化。如果你的對象是可序列化的,你可以序列化例如到ByteArrayOutputStream並讀取對象以獲取副本。
  • 實現您自己的基於反射的複製功能。
0

在Java中沒有內置工具來執行此操作。所以你必須手動完成。 主要是關於複製受影響的對象狀態並在回滾時恢復它們。

相關問題:

Transaction for POJOs

4

你可以看看在Memento Pattern

Memento模式是一種軟件設計模式,它提供了一個對象恢復到之前的能力狀態(通過回滾撤消)。