-1

当我单击表单上的保存按钮时

它调用了 3 个方法:

save_Purchase();
save_dtPurcaseProduct();
save_dtPurchaseProductExp();

这 3 种方法将更改保存到 3 个数据库表

所以情况是所有 3 个表都应该更新,或者没有一个表应该得到更新。

我使用 C# 和 Microsoft sql server 作为数据库

4

3 回答 3

2

如果您不想重写函数,可以使用TransactionScope

using (TransactionScope scope = new TransactionScope())
{
    try
    {
        save_Purchase();
        save_dtPurcaseProduct();
        save_dtPurchaseProductExp();

        scope.Complete(); //All goes well, then commit your transaction
    }
    catch(Exception ex)
    {
         //Do not call complete, on exit of transactionscope, transaction will rollback
    }
}
于 2013-07-16T07:36:19.330 回答
0

所有更新语句必须在里面transaction更多的

如果您正在使用Stored procedure以下方法编写存储过程。即所有三个Update语句inside a single transaction。这样您就可以在所有内容都更新时提交它,否则它将被回滚

CREATE/ALTER PROCEDURE Proc_Name
AS
BEGIN TRY
   BEGIN TRAN

-- Your Update Statements

     COMMIT TRAN
END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

如果您使用 SQL 查询和 ADO

使用以下方法

private static void Update() 
   {
      SqlConnection db = new SqlConnection("strConectionString");
      SqlTransaction transaction;

      db.Open();
      transaction = db.BeginTransaction();
      try 
      {
         new SqlCommand("update quey1", db, transaction)
            .ExecuteNonQuery();
         new SqlCommand("update quey2", db, transaction)
            .ExecuteNonQuery();
         new SqlCommand("update quey3", db, transaction)
            .ExecuteNonQuery();
         transaction.Commit();
      } 
      catch (SqlException sqlError) 
      {
         // always log or rethrow exceptions!
         transaction.Rollback();
         db.Close();
         //
         throw;
      }
      db.Close();
   }

[已编辑]当您确实遇到故障时,您应该始终记录(如果可以处理)或重新抛出它。否则,异常跟踪和关键诊断信息将被吞入“catch”块中。

在这种情况下,我建议重新向外抛出——因为最外层的系统或应用程序线程应该处理异常,并在此时记录它。如果发生异常,则更新显然失败并且业务逻辑不应继续。

于 2013-07-16T04:31:42.337 回答
0

而不是向数据库发送 3 个调用。您应该编写一个为您执行所有 3 个功能的存储过程。你应该在那里申请交易。如何在存储过程中实现事务

如果您想保留这 3 种方法,那么您还可以在代码级别应用事务。

      SqlConnection conn = new SqlConnection("Your Connection string");
      conn.Open()
      using (SqlTransaction tran = conn.BeginTransaction()) {
      try {
      // your code
      tran.Commit();
      }  catch {
       tran.Rollback();
       throw;
      }
      }
于 2013-07-16T05:20:35.250 回答