2013-07-29 41 views
1

數據庫事務的ACID屬性中的A原子性告訴我們,在數據庫上執行的每個事務都像二進制數字系統,0或1,全部或全部沒有。有沒有什麼辦法可以在OOP語言(如C#,Java)中實現原子性?

是否有可能在編程語言如Java或C#或任何其他通用語言中實現相同的功能?例如

public static Ticket GetTicket(string filePath) { 
    counter++; 
    Application app = new Application(filePath); 
    . 
    . 
    . 

也許,我給了一個壞榜樣,但我相信這應該足以給出一個想法。現在,想象一下,如果創建Application對象的行將引發異常,那麼應用程序的執行將暫停,並且靜態變量counter的狀態將已經發生變化,並且系統狀態發生變化。有沒有辦法來防止在拋出異常之前執行語句造成的損害?

回答

1

最簡單的機制,這樣的功能將是:

  1. 克隆,將通過以下
  2. 語句突變對象
  3. 突變克隆對象
  4. 更新基準指向克隆對象

這樣,直到最後一步,實際上纔會觀察到對對象引用的更改。

但是,如果沒有更具體的問題,這將很難正確回答。

+1

如果你使用不可變的類型,這是*唯一*繼續的方式。這是他們許多好處之一。 –

0

在拍攝某些變量等事件之前保存所有狀態,然後在try catch結構中進行更改。然後將所有更改回滾到原始狀態

int a = 5; 
int b = 1; 

int a2 = a; 
int b2 = b; 

try 
{ 
a += 10; 
b -= 1; 
a /= b; 
} 
catch(Exception ex) 
{ 
//roll back; 
a = a2; 
b = b2; 
} 
0

將所有可變狀態封裝在不可變對象中。

一個不可變的對象理想地只包含由公共getter屬性封裝的(私有)只讀字段。所有的字段必須使用傳遞給構造函數(或靜態工廠方法)的數據進行初始化。

如果你使用這樣的不可變對象,你可以保證狀態不能被部分更新(除了通過反射),它給你的事務性語義。

任何希望改變狀態部分的東西都必須構造並返回一個不可變對象的新實例,並將其狀態設置爲相應的狀態。

(你也可以使用一個不變的接口來表示一個不可變對象,但它是很難保證通過接口引用的對象將不被突變,因爲實例可能真的是一個可變的對象。)

相關問題