Одновременный доступ к базе данных с Entity Framework == EntityException

У меня есть база данных 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;
        }
8
задан J4N 2 March 2011 в 08:32
поделиться