gpt4 book ai didi

c# - 如何最大限度地减少或通知用户数据库连接滞后/失败?

转载 作者:行者123 更新时间:2023-11-30 22:14:10 25 4
gpt4 key购买 nike

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

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

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

现在,由于整个事物的结构,我无法更改,连接中断,或者哎呀,如果我在 VS2005 中放置一个调试点并让它在那里停留足够长的时间,应用程序批准流程就会开始不完整。这些表通常只是连接在一起,因此数据不匹配 - 此处缺少数据,主键未能更新 - 将意味着整行将无用。

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

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

谢谢。

最佳答案

But are there ways to minimize connection lag / failure? Or a way to inform the users that something went wrong with the process? A rollback changes feature (either via program, or SQL), so that any incomplete data in the database will be undone?

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

A transaction comprises a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions. Transactions in a database environment have two main purposes:

  1. To provide reliable units of work that allow correct recovery from failures and keep a database consistent even in cases of system failure, when execution stops (completely or partially) and many operations upon a database remain uncompleted, with unclear status.

  2. To provide isolation between programs accessing a database concurrently. If this isolation is not provided, the program's outcome are possibly erroneous.

<子> Source

.Net 中的事务

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

引用我的回答 here :

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

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

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

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

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

使用 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 语句)内声明事务。 See here获取更多信息。

关于c# - 如何最大限度地减少或通知用户数据库连接滞后/失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18626991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com