gpt4 book ai didi

c# - SqlTransaction 导致应用程序错误崩溃?

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:48 25 4
gpt4 key购买 nike

这里有一些背景:我们的站点会定期崩溃,以至于不得不重新启动 IIS;这几乎总是在修补 DLL 后的一个小时内发生(我们使用网站项目,而不是 Web 应用程序项目,因此每个 ASPX 页面都是一个单独的 DLL)。

在做一些研究时,我发现我们的自制 DAL 在调试时会导致带有 Visual Studio 的内置网络服务器实际上停止工作并在存储过程中遇到 SQL 错误时关闭(我是认真的不仅会抛出在浏览器中显示的异常,它实际上会说网络服务器遇到错误,需要关闭!)

在进一步挖掘中,错误似乎与 DAL 中所有内容(包括 Select 语句)的事务使用有关。似乎发生的事情是这样的:

  1. 尝试执行存储过程,存储过程由于丢失/无效列或其他错误而失败。
  2. 应用程序代码捕获错误并重新抛出它(不好,是的,但我没有写这个)。
  3. 尽管发生异常,事务仍尝试提交,在 transaction.Commit() 行(似乎在 Connection 上)得到一个 NullReferenceException属性,因为存在交易对象)。此外,这个 NullRef 似乎无法被捕获(我尝试了一个演示,该演示使用无效的 Sproc 强制崩溃,并且 NullRef 从未被捕获,即使输出错误的类型为 System.NullReferenceException)
  4. 交易抛出类似“交易已完成且不再可用”之类的错误。
  5. >???但是 VS 网络服务器崩溃了。调试这部分好像卡在上面的异常上,一直没离开方法。

现在,我不知道这是否是导致 IIS 崩溃的原因,但它看起来很可疑,无论如何都是一个明显的错误。

之前没有处理过事务,只是对事务有基本的了解,我的第一个问题是为什么事务在抛出异常后仍在尝试提交?我的第二个问题是如何修复失败的提交和可能的异常无限循环,直到服务器死机。添加这样的东西不是很有意义吗(该方法采用名为 transaction 的 SqlTransaction 参数):

catch (SqlException se) 
{
if (transaction != null)
{
transaction.Rollback();
}
throw;
}

这个小改动是否可以修复我认为会导致 IIS 崩溃的常量异常循环? DAL 本身非常脆弱,在数百个文件中具体使用,因此我无法从头开始正确地重写它。

编辑 整个代码块是这样的(同样,遗留代码 - 使用旧的微软数据访问 block 助手):

    public static DataSet ExecuteDatasetStoredProc(SqlConnection conn, String storedProcName, SqlTransaction transaction, params SqlParameter[] storedProcParms)
{
try
{
// Execute the stored proc
if (transaction != null)
{
return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, storedProcName, storedProcParms);
}
else
{
return SqlHelper.ExecuteDataset(conn, CommandType.StoredProcedure, storedProcName, storedProcParms);
}
}
catch (SqlException se)
{
throw new ApplicationException("Error calling " + storedProcName + ". " + se.Message, se);
}
}

但是,如果 catch block 执行事务仍会尝试提交,这似乎会导致挂断。

最佳答案

如果您将交易代码包装在 try catch 中,也可以更改您的代码

Try
{
// your code that you assign and execute the SQl

}
catch (SQLException sqlex)
{
try
{
//try to do the rollback here.. don't always assume the commit or rollback will work
}
catch (Your SQL Exception ex)
{
}
}

关于c# - SqlTransaction 导致应用程序错误崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535827/

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