繁体   English   中英

如何管理ado.net交易

[英]How to manage ado.net transaction

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

说我有以下内容

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

//服务层类

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

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

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

这通过定义具有两个部分的接口来实现:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM