我有这个代码,在两个独立的线程中并行运行。它可以正常工作几次,但在某个随机点它会抛出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();
}
答案 0 :(得分:2)
找到解决方案。原来打电话给这个
command.Connection = connection;
并不意味着您设置与命令的连接。在调用之后,我检查了
的结果command.Connection.GetHashCode();
command.GetHashCode();
他们并不平等。重新调整代码以使用connection.CreateCommand并解决问题。