1

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

说我有以下

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

// 服务层类

/// <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)对象?
4

1 回答 1

3

您可能想看一下工作单元模式

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

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

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

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

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

于 2012-09-26T19:26:19.477 回答