2

我有这段代码,在两个单独的线程中并行运行。它可以正常工作几次,但在某个随机点它会抛出 InvalidOperationException:

事务要么与当前连接无关,要么已完成。

在异常点,我正在使用 Visual Studio 查看事务并验证其连接设置是否正常。还有 command.Transaction._internalTransaction。_transactionState 设置为 Active 并且 IsZombied 属性设置为 false。

这是一个测试应用程序,我正在使用 Thread.Sleep 创建更长的事务并导致重叠。

为什么会抛出异常,我该怎么办?

IDbCommand command = new SqlCommand("Select * From INFO");
IDbConnection connection = new SqlConnection(connectionString);
command.Connection = connection;
IDbTransaction transaction = null;
try
{
    connection.Open();
    transaction = connection.BeginTransaction();
    command.Transaction = transaction;
    command.ExecuteNonQuery(); // Sometimes throws exception
    Thread.Sleep(forawhile); // For overlapping transactions running in parallel
    transaction.Commit();
}
catch (ApplicationException exception)
{
    if (transaction != null)
    {
        transaction.Rollback();
    }
}
finally
{
    connection.Close();
}
4

1 回答 1

2

找到了解决方案。原来叫这个

command.Connection = connection;

并不意味着您设置了与命令的连接。就在调用这个之后,我检查了结果

command.Connection.GetHashCode();
command.GetHashCode();

他们是不平等的。重构代码以使用 connection.CreateCommand 并解决问题。

于 2009-01-14T15:14:48.023 回答