如何管理ado.net交易

时间:2012-09-26 19:06:25

标签: c# ado.net transactions

我不确定在代码中管理此事务的好方法是什么。

说我有以下

服务层(非静态类) 存储库层(静态类)

//服务层类

/// <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();
            }
        }
    }
}

// Repo Class

   /// <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)对象的情况下执行此操作?

1 个答案:

答案 0 :(得分:3)

您可能需要查看unit of work pattern

工作单元模式准确定义了它的建议,即一次提交或根本不提交的工作单元。

这是通过定义一个包含两部分的接口来实现的:

  • 处理插入,更新,删除操作的方法(注意,您不必公开所有这些操作,并且您不限于一种实体类型)
  • 提交方法(如果您回滚,则只是不调用commit)。您可以在此处理交易以及注册要更改的所有实体的插入,更新和/或删除。

然后,您将传递此接口的实现,并在所有操作完成时在外部边界(您的服务)提交更改。

请注意,LINQ-to-Entities中的ObjectContext class和LINQ-to-SQL中的DataContext class都是工作单元的示例(您执行操作然后将它们保存在批处理中)。