如何最小化或通知用户数据库连接滞后/故障?

时间:2013-09-05 02:54:09

标签: c# asp.net sql-server visual-studio-2005

我正在维护一个ASP / C#程序,该程序使用MS SQL Server 2008 R2来满足其数据库要求。

在正常和完美的日子里,一切都很好。但我们并不是生活在一个完美的世界。

申请(休假,病假,加班,承担等)。审批流程最多需要十个与数据库的单独连接。程序连接到数据库,传递一些相关参数,并使用存储过程来完成工作。十次。

现在,由于整个事物的结构,我无法改变,连接中的下降,或者说,如果我在VS2005中放置一个调试点并让它在那里停留足够长的时间,应用程序批准过程就会发生不完整的。这些表通常只是连接在一起,所以数据不匹配 - 这里缺少数据,无法在那里更新的主键 - 将意味着整行都没用。

现在,我知道我无法阻止这一点 - 毕竟这是一个连接问题。

但有没有办法减少连接延迟/失败?或者通知用户该流程出现问题的方法?回滚更改功能(通过程序或SQL),以便撤消数据库中的任何不完整数据?

感谢。

2 个答案:

答案 0 :(得分:3)

  

但有没有办法减少连接延迟/失败?或者一种方式   告知用户该流程出了什么问题?一个   回滚更改功能(通过程序或SQL),以便任何   数据库中的不完整数据将被撤消?

正如我们在评论中所讨论的那样,交易将解决您的许多问题。

  

交易包括在数据库中执行的工作单元   管理系统(或类似系统)对数据库,并进行处理   以独立于其他交易的连贯可靠的方式。   数据库环境中的事务有两个主要目的:

     
      
  1. 提供可靠的工作单元,允许从故障中正确恢复,即使在系统情况下也能保持数据库一致   失败,执行停止(完全或部分)和许多   对数据库的操作仍未完成,状态不明。

  2.   
  3. 在同时访问数据库的程序之间提供隔离。如果没有提供此隔离,程序的结果   可能是错误的。

  4.   

<子> Source

.Net中的交易

正如您所料,数据库是为数据库相关操作提供事务支持所不可或缺的。但是,从业务层创建事务非常简单,并允许您跨多个数据库调用使用单个事务。

引用我的回答here

我看到了从业务层控制事务的几个原因:

  • 跨数据存储边界的通信。事务不必违反RDBMS;他们可以反对各种实体。

  • 能够根据您正在调用的特定存储过程可能无法使用的业务逻辑回滚/提交事务。

  • 在单个事务中调用任意查询集的能力。这也消除了担心交易计数的需要。

  • 个人偏好:c#具有更优雅的结构来声明事务:using块。相比之下,当跳转到回滚/提交时,我总是发现存储过程中的事务很麻烦。

使用TransactionScopereference)抽象最容易声明事务,这为您提供了很多功能。

using( var ts = new TransactionScope() )
{
    // do some work here that may or may not succeed

    // if this line is reached, the transaction will commit. If an exception is
    // thrown before this line is reached, the transaction will be rolled back.
    ts.Complete();
}

由于您刚刚开始处理交易,我建议您从.Net代码中测试一个交易。

  1. 调用执行INSERT的存储过程。
  2. 在INSERT之后,故意让程序产生任何类型的错误。
  3. 您可以通过查看自动回滚INSERT来验证您的实现。
  4. 数据库中的事务

    当然,您也可以在存储过程(或任何类型的TSQL语句)中声明事务。 See here了解更多信息。

答案 1 :(得分:0)

如果使用相同的SQLConnection或其他实现IDbConnection的连接类型,则可以执行类似于事务范围的操作,但不需要创建作为事务范围的安全风险。

在VB中:

Using scope as IDbTransaction = mySqlCommand.Connection.BeginTransaction()

   If blnEverythingGoesWell Then
      scope.Commit()
   Else
      scope.Rollback()
   End If

End Using

如果未指定commit,则默认为回滚事务。