Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Добрый день.
Есть таблица Category с полями id и name. name - уникальное поле.
Нужна функция поиска категории по имени, если такой категории нет, то нужно добавить новую категорию.
Обработка большого количества строк идет в разных потоках, соответственно возникает исключение при вставки неуникальных значений в поле name.
Начал копать в сторону транзакций:
private Category CreateOrFindCategory(string categoryName, PLEntities context)
        {
            Category category;
            using (TransactionScope tran = new TransactionScope(TransactionScopeOption.RequiresNew,
                new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.Serializable }))
            {
                category = context.Categories.FirstOrDefault(cat => cat.Name == categoryName);
                if (category == null)
                {
                    category = new Category() { Name = categoryName };
                    context.Categories.AddObject(category);
                    context.SaveChanges();
                }
                tran.Complete();
            }
            return category;
        }

в результате куча ошибок типа: "Транзакция вызвала взаимоблокировку ресурсов и стала жертвой взаимоблокировки. Запустите транзакцию повтороно."

Что делаю не так?
6 фев 13, 15:44    [13885431]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
noligin, отсоединяй контекст, добавляй что надо, а потом соединяй и обновляй данные
6 фев 13, 17:53    [13886418]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
noligin,

Как звучало условие задачи изначально? Что от вас требуют сделать?
6 фев 13, 21:13    [13887297]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Lord British,
изначальная задача:
есть таблица Client c полями id, client_name, id_category и вышеописанная таблица Category. Также есть текстовые файлы с несколькими тысячами строк формата: имя клиента, название категории. эти данные и нужно загрузить в бд.
Клиенты добавляются функцией CreateClient
public void CreateClient(string clientName, string categoryName)
{
  using (PLEntities context = new PLEntities ())
  {
     Category cat = CreateOrFindCategory(categoryName, context);
     Client client = new Client();
     client.Name = clientName;
     clietn.Category = Category;
     context.Clients.AddObject(client);
     context.SaveChanges();
  }
}


Вот и все условие.
6 фев 13, 22:50    [13887716]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
noligin,

Используйте штатные средства СУБД. Или через Management Studio --> Import Data --> Flat File --->, или пользуйтесь утилитой bcp, как тут
7 фев 13, 00:06    [13887894]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
noligin,

или гуглите bulk insert
7 фев 13, 00:08    [13887900]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Lord British,

при чем тут штатные средства и Managment Studio? мне надо чтобы это пользователь делал в программе

Proga
noligin, отсоединяй контекст, добавляй что надо, а потом соединяй и обновляй данные


я не понял, от чего отсоединять контекст?
7 фев 13, 04:53    [13888134]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
noligin
Proga
noligin, отсоединяй контекст, добавляй что надо, а потом соединяй и обновляй данные


я не понял, от чего отсоединять контекст?

я вам крайне рекомендую почитать литературу, статьи по EF, крайне полезное для Вас занятие окажется.
7 фев 13, 10:13    [13888759]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Proga
noligin
пропущено...


я не понял, от чего отсоединять контекст?

я вам крайне рекомендую почитать литературу, статьи по EF, крайне полезное для Вас занятие окажется.


Большое спасибо за совет. Не думайте что я не читал литературу по EF, но ее не так уж и много на русском языке. Про присоединение и отсоединение сущностей от контекста я тоже читал, и если это вы и имели ввиду в своем первом ответе - то я не совсем понимаю как это мне поможет.

ну а все таки, может кто нибудь даст дельный совет, кроме как RTFM
7 фев 13, 10:25    [13888837]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
noligin,

Вам не нужен ни EF, ни тем более многопоточность. Тысячи строк - это как пылинка на заднице слона. Вся ваша программа состоит из одной команды

BULK INSERT db2.dbo.mytbl
   FROM 'f:\temp\mytbl.csv'
   WITH 
      (
         FIELDTERMINATOR =' \t',
         ROWTERMINATOR =' \r\n'
      )


Сделайте к ней выбор пути и красивую кнопочку "ПОЕХАЛИ!" добавьте вызов этой команды и программа готова.

Для придания солидности проделываемой программой работе, рекомендую перед вызовом команды вызвать Threed.Sleep(). :D
7 фев 13, 10:43    [13888938]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
ps. это тема сферическая тема про EF, многопоточность и уровни изоляции в вакууме.
7 фев 13, 10:50    [13888993]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Lord British,

причем тут bulk insert? забудьте что информация берется из файлов.
Вызов CreateClient может производиться несколькими пользователями одновременно с одинаковыми значениями categoryName. В случае без транзакций возникает ошибка вставки неуникальных значений в таблицу. Если я использую транзакции как я написал - возникают дедлоки. Вот и вся проблема.
Насчет того что мне не нужна EF я может и соглашусь, могу это сделать создавая или находя id категории через хранимую процедуру. Но мне хочется узнать как это сделать через EF.
7 фев 13, 12:44    [13890041]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Proga
Member

Откуда: МО
Сообщений: 3042
noligin,

научитесь формулировать вопросы, я например в заголовке Вашего треда не видел вот этого
noligin
Вызов CreateClient может производиться несколькими пользователями одновременно с одинаковыми значениями categoryName
, а тут оказывается многопользовательская среда.
Напишите процедуру и вызывайте её при добавлении данных, в ней можно проверять уникальность и реагировать как Вам захочется.
7 фев 13, 12:56    [13890189]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
noligin
Member

Откуда:
Сообщений: 84
Proga,

согласен, изначально неверно сформулировал, каюсь:)
повторюсь, через процедуру я уже сделал, но мне хочется узнать как такое провернуть с помощью EF
7 фев 13, 13:00    [13890219]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
noligin
Proga,

согласен, изначально неверно сформулировал, каюсь:)
повторюсь, через процедуру я уже сделал, но мне хочется узнать как такое провернуть с помощью EF


транзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст
7 фев 13, 14:30    [13891041]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
noligin
ошибка вставки неуникальных значений в таблицу


причем тут транзакции вообще, у тебя есть уникальный индекс на поле name. при вставке неуникальных значений тебя оповещают - нельзя вставить, есть уже.

уровень изоляции транзакций Serializable для этой задачи - 5 баллов.
7 фев 13, 15:23    [13891618]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
pation
транзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст


по умолчанию она начинается и заканчивается в пределах метода SaveChanges. Он ее начинает и коммитит если все хорошо. У автора создается Ambient транзакция ее подхватит контекст, если в строке соединения установлено Enlist=True.

ps. уссыся потоки, контексты, сессии. наполеоновские задачи.
7 фев 13, 15:28    [13891671]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Lord British
pation
транзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст


по умолчанию она начинается и заканчивается в пределах метода SaveChanges. Он ее начинает и коммитит если все хорошо. У автора создается Ambient транзакция ее подхватит контекст, если в строке соединения установлено Enlist=True.

ps. уссыся потоки, контексты, сессии. наполеоновские задачи.


проблемма как раз в том и есть, что для одного контекста SaveChanges выполняется в разных потоках, дополнительный скоп тут и не нужен, а вот поставить lock либо, повторюсь использовать разные контексты поможет делу
7 фев 13, 17:07    [13892748]     Ответить | Цитировать Сообщить модератору
 Re: Entity Framework: многопоточность и транзакции  [new]
Lord British
Member

Откуда: На Камчатке красиво?
Сообщений: 758
pation, я глядел код ровно до слова Serializable. приминительно к этому коду, похоже вы правы. но смысла в авторском подходе нет. хозяин барин.
7 фев 13, 17:23    [13892878]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить