【发布时间】:2014-04-30 14:47:02
【问题描述】:
我在 ASP.NET 中使用事务时遇到问题
每次我使用下面的代码时都会出现异常:
此 SqlTransaction 已完成;它不再可用。
我到处寻找(包括堆栈溢出)如何解决这个问题,但一切正常。
我正在尝试向 db 插入一条记录(我正在使用 SQL Server)。请参阅下面的代码:
Database db = new Database();
db.Connect();
SqlCommand command = new SqlCommand(SQL_UPDATE_ADRESA, db.Connection);
command.Parameters.Add(new SqlParameter("@pPersonID", SqlDbType.Int)).Value = personID;
command.Parameters.Add(new SqlParameter("@pStreet", SqlDbType.VarChar, 30)).Value = street;
command.Parameters.Add(new SqlParameter("@pCity", SqlDbType.VarChar, 30)).Value = city;
db.BeginTransaction();
command.Transaction = db.SqlTransaction;
int rows = 0;
try
{
rows = db.ExecuteNonQuery(command);
db.EndTransaction();
}
catch
{
rows = -1;
db.Rollback();
}
db.Close();
return rows;
在“数据库”类中调用的方法和属性是:
属性:
private SqlTransaction mSqlTransaction = null;
public SqlTransaction SqlTransaction
{
get { return mSqlTransaction; }
}
方法:
public void BeginTransaction()
{
mSqlTransaction = mConnection.BeginTransaction(IsolationLevel.Serializable);
}
public void EndTransaction()
{
mSqlTransaction.Commit();
Close();
}
public void Rollback()
{
mSqlTransaction.Rollback();
}
我尝试在 SQL Server 上设置 IMPLICIT_TRANSACTIONS ON, 重写代码(使用,不使用数据库方法和其他东西,但我看不出哪里有问题)。
每次我尝试使用该命令时都会引发此异常。
编辑:
变量“rows”在执行后等于1,所以记录被正确插入,但是在它之后,程序在“Commit”处抛出异常,所以它会catch语句,在这里它在调用a时再次抛出异常回滚方法。在这次崩溃之后,数据库被回滚并且没有任何改变。
EDIT2:
它可以与命令有关吗?就像只有一个更新,所以它是自动提交的,或者类似的东西?
【问题讨论】:
-
您正在使用该捕获抑制所有错误,因此您永远不会发现是否存在错误。
-
我在没有 try/catch 的情况下尝试过,它会引发相同的异常,但是在提交部分的回滚部分
-
代码看起来没问题。这意味着错误(显然存在)位于此处未发布的部分代码中。要么发布所有相关的部分,要么创建一个小型的、独立的复制品。通过执行后者,您可能会自己发现错误。你能在 10 行内重现这个错误吗?我打赌你不能。
-
我发现了问题...Database.ExecuteNonQuery 的最后部分有 Close() 方法,它自动将此事务转换为 null,所以后来当我尝试使用它时引发异常...
-
是的,我认为这将是一些微不足道的错误。将程序减少到 10 行总能发现这些问题,因为没有隐藏的余地。
标签: c# asp.net sql .net transactions