【问题标题】:Rollback a stored procedure call from inside a transaction using LINQ-to-SQL?使用 LINQ-to-SQL 从事务内部回滚存储过程调用?
【发布时间】:2008-11-21 02:39:54
【问题描述】:

我有一个与 SQL Server 数据库一起运行的 C#.net winform 程序。我正在使用 LINQ-to-SQL。是否可以使用 LINQ-to-SQL 回滚对我的程序内事务中的一个或多个存储过程的调用?

最初我认为在存储过程中管理事务是有意义的,但如果我需要回滚多个存储过程调用作为单个事务的一部分,则需要在我的 C# 程序中完成。

有人可以向我指出如何执行此操作的代码 sn-p 或提供对替代方案的一些见解吗?

【问题讨论】:

    标签: c# sql-server linq linq-to-sql stored-procedures


    【解决方案1】:

    DbTransaction 的另一个替代方案是 TransactionScope - 这提供了一个更简单的编程模型,并且可以扩展到多个同时的数据库和其他源(通过 DTC) - 但代价是连接上的少量开销.它过去的开销更大,但在 SQL2005 等下,它将使用“LTM”,直到您开始跨越多个连接 - 所以单个操作通常非常便宜:

    using (TransactionScope tran = new TransactionScope())
    using (FooDataContext ctx = new FooDataContext())
    {
        // your work with ctx
        // ...
        // other work involving connections etc
        // ...
        tran.Complete();
    }
    

    非常简单;-p 您还应该能够使事务更细化(仅通过几个查询)或更简单地包含。大多数现有代码将自动加入事务范围,从而非常容易改造现有代码。

    有关 TransactionScope(以及 .NET 中的一般事务)的更多信息,请参阅 here

    【讨论】:

    • 只是想澄清一点,如果它不明显:“Complete 方法提交事务。如果抛出异常,则不调用完成并回滚事务。” (来自上面的第一个链接)所以不要去寻找“回滚()”并且没有任何代码路径在没有 Complete()的情况下“返回”
    【解决方案2】:

    虽然我没有使用存储过程,但你可以有类似的东西:

        public Response<SomeObject> SaveSomething(Object yourObject)
        {
            DbTransaction dbTransaction = null;
            try
            {
                using (DataContext context = new DataContext())
                {
                        //Creates a new DB transaction
                        if (context.Connection.State == System.Data.ConnectionState.Closed)
                        {
                            context.Connection.Open();
                        }
                        dbTransaction = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
                        context.Transaction = dbTransaction;
    
             context.SaveYourObject(yourObject);
                        //Commit the transaction
                        dbTransaction.Commit();
                        response.ResponseObject = yourObject;
                        response.Messages.AddSuccessfulSave("Saved!");
                    }
                }
            }
            catch (ChangeConflictException cex)
            {
                if (dbTransaction != null) dbTransaction.Rollback();
                response.Errors.AddConcurrencyError();
                response.IsSuccessful = false;
            }
            catch (SqlException sqlEx)
            {
                if (dbTransaction != null) dbTransaction.Rollback();
                if (sqlEx.Class == 14 && (sqlEx.Number == 2601 || sqlEx.Number == 2627)) //Duplicated key
                {
                    response.Errors.Add(new Error
                    {
                        Name = "Duplicate item",
                        Description = "This object already exists."
                    });
                    ExceptionPolicy.HandleException(sqlEx, SERVICE_EXCEPTION_POLICY);
                    response.IsSuccessful = false;
                }
                else //other SQL errors
                {
                    response.Errors.AddSavingError("Your object", yourObjectId);
                    ExceptionPolicy.HandleException(sqlEx, SERVICE_EXCEPTION_POLICY);
                    response.IsSuccessful = false;
                }
            }
    

    【讨论】:

      【解决方案3】:
      private string RollBack_fn()
      {
          int sal = 0;
          OracleConnection myconn = new OracleConnection(ConfigurationManager.AppSettings["con"].ToString());
          cmd = new OracleCommand("SP_student_MAST", myconn);
          cmd.CommandType = CommandType.StoredProcedure;
          OracleParameter param1 = null, param2 = null, param3 = null, param4 = null, param5 = null;
      
          try
          {
              myconn.Open();
             trans = myconn.BeginTransaction();
              cmd.Transaction = trans;
              //param1 = new OracleParameter("pSNo", OracleType.VarChar, 5);
              //param1.Value ="";
              //cmd.Parameters.Add(param1);
      
              param2 = new OracleParameter("pSName", OracleType.VarChar, 10);
             // param2.Value = "Saravanan";
              param2.Value = TextBox1.Text;
              cmd.Parameters.Add(param2);
      
              param3 = new OracleParameter("pENo", OracleType.VarChar,5);
              param3.Value = TextBox2.Text;
              cmd.Parameters.Add(param3);
      
              param4 = new OracleParameter("pEName", OracleType.VarChar,10);
             // param4.Value = "Sangeetha";
              param4.Value = TextBox3.Text;
              cmd.Parameters.Add(param4);
      
              param5 = new OracleParameter("pSENo", OracleType.Char, 5);
              param5.Value = "";
              cmd.Parameters.Add(param5);
              sal = cmd.ExecuteNonQuery();
              trans.Commit();
              Response.Write("Record Saved");
              myconn.Close();
             // rollbackvalue = 0;
          }
          catch (Exception ex)
          {
              Response.Write("Not saved.RollBacked");
              trans.Rollback();
              //rollbackvalue = 1;
          }
          string cs = Convert.ToString(sal);
          return cs;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多