【发布时间】:2020-04-26 11:54:37
【问题描述】:
我在 ASP.NET 操作开始时为 TransactionScope 设置了一个 using 块。在某个地方,我使用该块执行一个函数,该函数既为SqlCommand 创建一个使用块,又为我的SqlConnection 创建一个使用块。
命令和连接的块在函数被重用时打开和关闭,但都带有TransactionScope using 块。最终我打电话给scope.Complete(),当离开TransactionScope using 块时,我得到一个异常,说没有启动可以提交的事务。在调试中,我发现实际上所有数据库调用都只是在没有事务的情况下发生。
根据文档,TransactionScope 的生成似乎应该是事务的生成,或者,至少在我第一次打开任何数据库连接时,事务应该开始,因为它是 w/i 事务范围块。然而事实并非如此,我不确定为什么会这样。
实际上,我曾经一度可以正常工作,然后突然之间,它就无法正常工作了。所以是我做的一些事情导致了它,但我不知道它是什么,因为它实施的部分很久以前就完成了。
这里有一些代码:
启动事务作用域
using (TransactionScope transactionScope = new TransactionScope())
{
try
{
LegacyDataManager.Start();
//*******************Replace W/ Controller Logic*********************
ViewBag.Message = "Finish";
...
...
...
LegacyDataManager.Commit();
transactionScope.Complete();
}
finally
{
LegacyDataManager.Stop();
}
}
调用执行数据库更新的代码
var theApproval = LegacyDataManager.PrepareForUpdate(Constants.ObjectApproval, row["objectInstance"].ToString(), row["sourceServer"].ToString());
theApproval.write("approvalaction", Request.Form[val].ToString().Substring(0, 1));
theApproval.write("approvaldate", Data_Legacy.getAodDateTimeNow());
theApproval.saveObject();
数据库查询执行
Data.executeSP("sp_Object_InsertData", SearchNew.generateSQLParameterString("ObjectType", "ObjectInstance", "Parameter", "ParameterValue", "SourceServer"),
SearchNew.generateSQLParameterString(
ObjectType,
ObjectInstance.ToString(),
theNametext,
Regex.Replace(thetheVal, @"\'", "\'\'").Trim(),
SourceServer));
public static DataTable executeSP(string storedProc, SqlParameter[] parms = null, bool gatherParams = true, int commandTimeout = 0)
{
using (SqlCommand cmd = new SqlCommand())
{
if (commandTimeout != 0)
{
cmd.CommandTimeout = commandTimeout;
}
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storedProc;
handleParameters(cmd.Parameters, storedProc, parms, gatherParams);
using (SqlConnection conn = Data.getConnection("AOD"))
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
var da = new SqlDataAdapter();
var dt = new DataTable();
da.SelectCommand = cmd;
da.Fill(dt);
return dt;
}
}
}
提前感谢您的任何建议。
好消息是它可以被删除,但坏消息是它创建了一个烦人的编程环境,其中该系统所基于的 XML 数据文件在错误期间不会更新,但更新的 SQL 数据会被镜像out to 被保留了……不要问为什么会这样……就是这样。
【问题讨论】:
标签: asp.net .net sql-server