2012-09-26 121 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都是工作单元(您执行操作并将它们保存在一个批处理中)的示例。