2012-09-26 118 views
1

我不確定在代碼中管理此交易的好方法是什麼。如何管理ado.net交易

說我有以下

服務層(非靜態類) 庫層(靜態類)

//服務層類

/// <summary> 
/// Accept offer to stay 
/// </summary> 
public bool TxnTest() 
{ 
    using (SqlConnection conn = new SqlConnection(ConnectionString)) 
    { 
     conn.Open(); 
     SqlTransaction txn = conn.BeginTransaction(); 

     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.Transaction = txn; 

      try 
      { 
       DoThis(cmd); 
       DoThat(cmd); 

       txn.Commit(); 
      } 
      catch (SqlException sqlError) 
      { 
       txn.Rollback(); 
      } 
     } 
    } 
} 

//回購類

/// <summary> 
    /// Update Rebill Date 
    /// </summary> 
    public static void DoThis(SqlCommand cmd) 
    { 
     cmd.Parameters.Clear(); 
     cmd.Parameters.AddWithValue("@SomeParam", 1); 

     cmd.CommandText = "Select * from sometable1"; 
     cmd.CommandType = CommandType.Text; 
     cmd.ExecuteNonQuery(); 
    } 



/// <summary> 
     /// Update Rebill Date 
     /// </summary> 
     public static void DoThat(SqlCommand cmd) 
     { 
      cmd.Parameters.Clear(); 
      cmd.Parameters.AddWithValue("@SomeParam", 2); 

      cmd.CommandText = "Select * from sometable2"; 
      cmd.CommandType = CommandType.Text; 
      cmd.ExecuteNonQuery(); 
     } 
  1. 上述方法是否有用?對存儲庫使用靜態類還是會產生問題是否明智?
  2. 有沒有辦法做到這一點,而不必傳遞命令(cmd)對象?

回答

3

你可能想看看unit of work pattern

工作單元模式確切地定義了它的含義,一次完成的工作單元或完全不工作的單元。

出現這種情況通過定義有兩個部分的接口:用於處理你的插入,更新,刪除操作(注

  • 方法,你不必暴露所有這些操作,你不是活得t限於一種實體類型)
  • 提交方法(如果您回滾,則不需要調用commit)。這是您處理事務以及插入,更新和/或刪除所有已註冊要更改的實體的地方。

然後,您將傳遞此接口的實現,並在所有操作完成時在外邊界(您的服務)提交更改。

請注意,LINQ-to-Entities中的ObjectContext class和LINQ-to-SQL中的DataContext class都是工作單元(您執行操作並將它們保存在一個批處理中)的示例。