ado.net Transactions.commit бросает семафорфулексцепцию - PullRequest
11 голосов
/ 11 февраля 2011

Когда я совершаю транзакцию, я получаю:

System.Threading.SemaphoreFullException: Adding the specified count to the semaphore would cause it to exceed its maximum count.
   at System.Threading.Semaphore.Release(Int32 releaseCount)
   at System.Data.ProviderBase.DbConnectionPool.PutNewObject(DbConnectionInternal obj)
   at System.Data.ProviderBase.DbConnectionPool.DeactivateObject(DbConnectionInternal obj)
   at System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject)
   at System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Close()
   at System.Data.SqlClient.SqlConnection.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   // rest of my stack trace here

Что это значит? Я где-то не закрываю соединение должным образом и не заполнил бассейн? Если это так, как я могу проверить это в SQL Server 2008 R2?

вот мой код (хотя это может быть не код, повинный в возникновении утечки соединения)

using (var connection = connectionFactory.GetConnection())
{
    connection.Open();

    using (var transaction = connection.BeginTransaction())
    {
        try
        {
            using (var command = connection.CreateCommand())
            {
                command.Connection = connection;
                command.Transaction = transaction;
                command.CommandText = "some sql"

                data = (string) command.ExecuteScalar();

                transaction.Commit();
            }
        }
        catch
        {
            try
            {
                transaction.Rollback();
            }
            catch
            {
            }
            throw;
        }
    }
}

return data;

1 Ответ

2 голосов
/ 09 июня 2011

Как упоминал Пит, это может быть ошибка в пуле соединений.В любом случае, я заметил, что в вашем коде отсутствует вызов, который, по словам MS, требуется.От MSDN

   // Must assign both transaction object and connection
   // to Command object for a pending local transaction
   command.Connection = connection;
   command.Transaction = transaction;

Попробуйте и посмотрите, все ли еще произойдет.

...