Соединения, похоже, остаются в пуле и не используются повторно в случае, если вы получите исключение, как в примере. Если вы увеличите время ожидания, соединение будет использовано повторно.
Временное решение этой проблемы - очистить пул соединений на случай, если вы получите исключение, подобное этому:
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
try
{
Console.WriteLine("Server is {0}", con.ServerVersion);
Console.WriteLine("Clr is {0}", Environment.Version);
for (int i = 0; i < 5; i++)
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "insert into TXTEST values ( " + i + " )";
cmd.ExecuteNonQuery();
}
Console.WriteLine("Row inserted");
}
Thread.Sleep(TimeSpan.FromSeconds(1));
}
catch
{
SqlConnection.ClearPool(con);
throw;
}
}
В большинстве случаев транзакция будет завершена в течение тайм-аута, и все будет хорошо. Когда транзакция на самом деле делает тайм-аут, вы очищаете пул, чтобы очистить грязные соединения, которые не будут повторно использоваться. Это, конечно, повлияет на другие соединения в пуле, на которые эта проблема не влияет.
Это уродливый обходной путь, но, похоже, он работает.