Получение «Операция недопустима для состояния транзакции.», Но я не использую транзакцию - PullRequest
3 голосов
/ 07 июня 2011
Stack Trace:    at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
  at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
  at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
  at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
  at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
  at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
  at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
  at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
  at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
  at System.Data.SqlClient.SqlConnection.Open()
  at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
  at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
  at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
  at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
  at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
  at System.Linq.Queryable.All[TSource](IQueryable`1 source, Expression`1 predicate)

Я не использую транзакцию или TransactionScope на данный момент.Создается ли транзакция автоматически средой, если она не существует, или транзакция подкрадывается откуда-то?

Это C # .NET 4, запрашивающий MS SQL 2008 с использованием LINQ-to-SQL.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

LINQ to SQL создает транзакцию, когда вы выполняете SaveChanges, так что фиксация является атомарной - то есть либо все изменения сохраняются, либо ни одного.

1 голос
/ 01 марта 2013

Хотя это не альтернативный ответ, я хотел бы остановиться на этом, поскольку я только что столкнулся с этой проблемой в своем собственном приложении.

У меня есть приложение ASP.Net, использующее инфраструктуру .Net 4.0, и я вижу,тот же callstack и исключение, по крайней мере, из SqlConnection.Open () и далее.Исключение занимает какое-то время, обычно для его запуска достаточно более 20 пользователей, обращающихся к приложению.Тем не менее, основная причина исключения потенциально отличается от OP.

Я обнаружил, что исключение генерируется, поскольку рабочий поток, обрабатывающий запрос ASP.Net, содержит внешнюю транзакцию, которая ссылается натранзакция, которая ранее была прервана и очищается потоком финализатора.По сути, код, который создал транзакцию, не распорядился ею, поэтому дело за Финализатором - очистить ресурсы.Проблема в том, что внешняя транзакция для рабочего потока не очищается, пока Finalzer не выполнит свою задачу.Это означает, что будущие запросы, выполняющиеся в потоке до завершения финализатора, будут зачислены в эту уже прерванную транзакцию (автоматическое зачисление должно быть включено, если вы не зачислились специально).

Основной причиной этой проблемы был кошмар, который нужно отслеживатьМы надеемся, что если кто-то решит ту же проблему, он не потратит больше недели на то, чтобы заработать себе на старом добром WinDbg, как я только что сделал:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...