У меня есть база данных MS SQL 2008, доступ к которой осуществляется через LINQ для обновления / получения данных.
Мой linq доступен службам WCF в режиме создания экземпляра PerCall для тяжелого приложения. В этом приложении есть несколько потоков, которые обращаются к службе, и несколько приложений работают в одно и то же время.
У меня часто случаются исключения EntityException:
System.Data.EntityException был перехвачен Сообщение = Произошла ошибка при запуске транзакции в соединении с провайдером. Подробнее см. Внутреннее исключение. Источник = System.Data.Entity Трассировки стека: в System.Data.EntityClient.EntityConnection.BeginDbTransaction (IsolationLevel isolatedLevel) в System.Data.EntityClient.EntityConnection.BeginTransaction () в System.Data.Objects.ObjectContext.SaveChanges (параметры SaveOptions) в Infoteam.GfK.TOMServer.DataServer.DataServer.SaveChanges () в D: \ Workspace \ XYZWASDF \ DataServer \ DataServer.cs: строка 123 InnerException: System.Data.SqlClient.SqlException Сообщение = Новая транзакция не авторизована и не содержит текущих потоков, которые выполняются в сеансе. Источник = .Net поставщик данных SqlClient Код ошибки = -2146232060 Класс = 16 LineNumber = 1 Число = 3988 Процедура = "" Сервер = ift-srv114 Состояние = 1 Трассировки стека: в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest (буфер Byte [], запрос TransactionManagerRequestType, String имя транзакции, TransactionManagerIsolationLevel isoLevel, тайм-аут Int32, транзакция SqlInternalTransaction, состояние TdsbjectPrebestarserObject isoLevel) в System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon (TransactionRequest transactionRequest, String имя транзакции, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) в System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction (TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) в System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction (IsolationLevel iso, String имя_транзакции) в System.Data.SqlClient.SqlInternalConnection.BeginTransaction (IsolationLevel iso) в System.Data.SqlClient.SqlConnection.BeginDbTransaction (IsolationLevel isolatedLevel) в System.Data.Common.DbConnection.BeginTransaction (IsolationLevel isolatedLevel) в System.Data.EntityClient.EntityConnection.BeginDbTransaction (IsolationLevel isolatedLevel) InnerException:
(Извините, это не очень читается). (Сообщение о внутреннем исключении означает: «Новая транзакция не разрешена, потому что в сеансе запущены другие потоки».
Я проверял, я не в цикле, это чисто случайно, когда создается это исключение. , и я не знаю, как этого избежать.
любая помощь будет очень признательна :)
Спасибо!
РЕДАКТИРОВАТЬ: Вот пример того, где я получал это исключение ИНОГДА
//My DataServer method, which is a singleton
[MethodImpl(MethodImplOptions.Synchronized)]
public void SaveChanges()
{
lock (_lockObject)
{
try
{
_context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
_changeListener.ManageIDAfterInsert();
}
catch (Exception ex)
{
Logger.Instance.Error("[DataServer:SaveChanges] Got an error when trying to save an object", ex);
//HERE I've this error
}
}
}
//One example where I can have exception sometimes, this is called through a WCF service, so I have a method which attach the object and then save it
private OrderStatus AddOrderStatus(OrderStatus orderStatus)
{
DataServer.DataServer.Instance.InsertOrUpdateDetachedObject(orderStatus);
return orderStatus;
}