2013-07-29 47 views
4

我不知道是否有一種簡單的方式來處理C#中的某種交易。讓我們說,我們有兩個屬性,我們想更新它們的值。我們可以這樣寫:在純粹的C#編碼交易

A = GetA(); 
B = GetB(); 

的問題是,如果異常將同時分配B時拋出,則對象將是不一致的狀態,因爲A已經更新。我們可以通過存儲的當前值和捕獲異常爲B打交道時解決這個問題:

var tempA = A; 
A = GetA(); // A is up to date 
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted 

即使上述方案未保存,因爲異常可以同時恢復一個被拋出,但問題是,如果有是在.NET中的機制中構建的,它簡單地實現了這些操作?

我能想象像下面的語句:

​​

或代碼建設,如:

Transaction.Enter(); 
A = GetA(); 
B = GetB(); 
Transaction.Leave(); 

事務之前的機器狀態將被保存,交易完成後,將在以下情況下被還原例外。 .NET中是否有這樣的東西?

+0

[軟件事務內存](http://en.wikipedia.org/wiki/Software_transactional_memory)? –

+0

'tempA = GetA(); B = GetB(); A = tempA'? – cHao

+0

@cHao A = tempA可能會拋出異常,因爲我們不知道如何實現setter。 –

回答

4

您可以使用TransactionScope類。

例子:

using(var scope = new TransactionScope()) 
{ 
    DoAction1(); 
    DoAction2(); 

    scope.Complete(); 
} 
+0

你需要'scope.complete()'嗎?似乎與「using」語句的概念相反。 – basher

+0

您需要在交易完成之前將交易標記爲「已完成」,如果您未將其標記爲完整,則會在「使用」範圍末尾回退。 –