簡體   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