У меня есть контекст распределенной транзакции, использующий ServiceDomain
.Внутри него я открываю соединение SQL со строкой соединения, указывающей Enlist=false
, чтобы оно не автоматически не зачислялось в транзакции.Затем, если я вручную зафиксирую соединение в распределенной транзакции, используя EnlistDistributedTransaction
, соединение не закроется, что может закончиться InvalidOperationException
с:
Истекло время ожидания.Время ожидания истекло до получения соединения из пула.Это могло произойти из-за того, что все пул подключений использовались и был достигнут максимальный размер пула.
Попробуйте выполнить следующее:
try
{
var configuration = new ServiceConfig
{
Transaction = TransactionOption.Required,
TransactionTimeout = 1000
};
ServiceDomain.Enter(configuration);
for (var i = 0; i < 500; ++i)
{
Console.WriteLine(i);
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=dotest;Integrated Security=SSPI;Enlist=False;"))
{
conn.Open();
if (i % 2 == 0) conn.EnlistDistributedTransaction((ITransaction) ContextUtil.Transaction);
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO [Test]([ID]) VALUES(@num)";
cmd.Parameters.AddWithValue("@num", i);
cmd.ExecuteNonQuery();
}
}
}
ContextUtil.SetAbort();
}
finally
{
ServiceDomain.Leave();
}
Это зависает (и умирает после истечения времени ожидания)при 200 соединениях, поскольку все 100 подключенных соединений, очевидно, не закрываются (и размер пула соединений по умолчанию равен 100).(Обратите внимание, что вы можете полностью удалить команду, если хотите проверить ее, не создавая таблицу.)
Что я пропустил или сделал неправильно?