2

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

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

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

现在,由于整个事物的结构,我无法更改,连接中的下降,或者见鬼,如果我在 VS2005 中放置一个调试点并让它挂在那里足够长的时间,应用程序批准过程将不完整。这些表通常只是连接在一起,因此数据不匹配(此处缺少数据,此处无法更新主键)意味着整行将无用。

现在,我知道我无法阻止这种情况发生——毕竟这是一个连接问题。

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

谢谢。

4

2 回答 2

3

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

正如我们在评论中所讨论的,交易将解决您的许多担忧。

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

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

  2. 在同时访问数据库的程序之间提供隔离。如果不提供这种隔离,则程序的结果可能是错误的。

资源

.Net 中的交易

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

在这里引用我的回答:

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

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

  • 基于您正在调用的特定存储过程可能不可用的业务逻辑回滚/提交事务的能力。

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

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

事务最容易使用TransactionScope( reference ) 抽象来声明,它为您完成了艰苦的工作。

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 已自动回滚来验证您的实现。

数据库中的事务

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

于 2013-09-05T03:37:04.287 回答
0

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

在 VB 中:

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

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

End Using

如果不指定提交,则默认为回滚事务。

于 2013-09-05T04:10:42.550 回答