2012-12-19 28 views
9

我有2個表查詢和細節。 在保存按鈕點擊我寫回滾在c#

fbsave(); 
fbsavedetails(); 

fbsave()保存數據的查詢表和fbsavedetails()保存在細節表中的數據。

現在,如果在fbsavedetails()中發生錯誤,則兩個步驟都應該回滾。

是否有可能?

+0

MS Access或SQL服務器? – andy

+2

你如何做你的數據層?存儲,程序? LINQ到SQL?連接的?斷開? –

+0

你可以通過使用事務來做你想做的事情,http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer

回答

8

可以明確創建事務,並通過周圍,即

using(var connection = ...) 
{ 
    connection.Open(); 
    using (var tran = connection.BeginTransaction()) 
    { 
     try 
     { 
      FBSave(connection, tran); 
      FBSaveDetails(connection, tran); 
      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

請注意,在這裏你必須也設置在每個命令Transaction,因此,爲什麼你需要通過它,所有的命令必須位於同一個連接對象上。


或者:您可以使用TransactionScope;重要的是,該Open()發生TransactionScope獲得自動入伍:

using(var tran = new TransactionScope()) 
{ 
    FBSave(); 
    FBSaveDetails(); 
    tran.Complete(); 
} 

或:

using(var tran = new TransactionScope()) 
using(var connection = ...) 
{ 
    connection.Open(); 
    FBSave(connection); 
    FBSaveDetails(connection); 
    tran.Complete(); 
} 

TransactionScope方法,你不需要設置什麼特別的東西 - 大部分它是自動的。當然,您可以選擇將連接傳遞給方法,但它們也可以獲得自己的連接,並且在大多數情況下它可以正常工作。

+0

「在TransactionScope內部打開以獲取自動登記」是否否定了對DTC的需求? –

+0

@MrMoose否,但是你*通常可以通過傳遞連接來避免對DTC的需要:如果你只在'TransactionScope'中使用一個連接對象,那麼它將被LTM而不是DTC處理(在所有版本中SQL Server> = 2005,IIRC) –

7

您可以使用TransactionScope。

using(var scope = new TransactionScope()) 
{ 
    //Complete the transaction only when both inserts succeed. 
    scope.Complete(); 
} 

如果您未完成事務範圍,它將被回滾。

1

有解決這個問題

  1. 使用DbTransaction並通過圍繞這兩個方法的DbTransaction,如果成功,回滾,如果發生錯誤 利弊提交事務兩種方式:DbTransaction需要到處傳遞。
  2. 使用的TransactionScope 優點:易於使用 缺點:不支持訪問,如果數據庫SQL2000,需要MSDTC進行配置