powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework: многопоточность и транзакции
19 сообщений из 19, страница 1 из 1
Entity Framework: многопоточность и транзакции
    #38140210
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть таблица Category с полями id и name. name - уникальное поле.
Нужна функция поиска категории по имени, если такой категории нет, то нужно добавить новую категорию.
Обработка большого количества строк идет в разных потоках, соответственно возникает исключение при вставки неуникальных значений в поле name.
Начал копать в сторону транзакций:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
        }


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

Что делаю не так?
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38140567
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin, отсоединяй контекст, добавляй что надо, а потом соединяй и обновляй данные
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38140802
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin,

Как звучало условие задачи изначально? Что от вас требуют сделать?
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38140884
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British,
изначальная задача:
есть таблица Client c полями id, client_name, id_category и вышеописанная таблица Category. Также есть текстовые файлы с несколькими тысячами строк формата: имя клиента, название категории. эти данные и нужно загрузить в бд.
Клиенты добавляются функцией CreateClient
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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();
  }
}



Вот и все условие.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38140925
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin,

Используйте штатные средства СУБД. Или через Management Studio --> Import Data --> Flat File --->, или пользуйтесь утилитой bcp, как тут
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38140928
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin,

или гуглите bulk insert
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141008
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British,

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

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

я не понял, от чего отсоединять контекст?
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141158
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noliginProganoligin, отсоединяй контекст, добавляй что надо, а потом соединяй и обновляй данные

я не понял, от чего отсоединять контекст?
я вам крайне рекомендую почитать литературу, статьи по EF, крайне полезное для Вас занятие окажется.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141180
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Proganoliginпропущено...


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

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

ну а все таки, может кто нибудь даст дельный совет, кроме как RTFM
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141210
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
BULK INSERT db2.dbo.mytbl
   FROM 'f:\temp\mytbl.csv'
   WITH 
      (
         FIELDTERMINATOR =' \t',
         ROWTERMINATOR =' \r\n'
      )



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

Для придания солидности проделываемой программой работе, рекомендую перед вызовом команды вызвать Threed.Sleep(). :D
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141227
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps. это тема сферическая тема про EF, многопоточность и уровни изоляции в вакууме.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141511
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British,

причем тут bulk insert? забудьте что информация берется из файлов.
Вызов CreateClient может производиться несколькими пользователями одновременно с одинаковыми значениями categoryName. В случае без транзакций возникает ошибка вставки неуникальных значений в таблицу. Если я использую транзакции как я написал - возникают дедлоки. Вот и вся проблема.
Насчет того что мне не нужна EF я может и соглашусь, могу это сделать создавая или находя id категории через хранимую процедуру. Но мне хочется узнать как это сделать через EF.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141553
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noligin,

научитесь формулировать вопросы, я например в заголовке Вашего треда не видел вот этого
noliginВызов CreateClient может производиться несколькими пользователями одновременно с одинаковыми значениями categoryName, а тут оказывается многопользовательская среда.
Напишите процедуру и вызывайте её при добавлении данных, в ней можно проверять уникальность и реагировать как Вам захочется.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141564
noligin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Proga,

согласен, изначально неверно сформулировал, каюсь:)
повторюсь, через процедуру я уже сделал, но мне хочется узнать как такое провернуть с помощью EF
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141778
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noliginProga,

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

транзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141900
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noliginошибка вставки неуникальных значений в таблицу

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

уровень изоляции транзакций Serializable для этой задачи - 5 баллов.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38141916
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationтранзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст

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

ps. уссыся потоки, контексты, сессии. наполеоновские задачи.
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38142159
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord Britishpationтранзакция уже содержится в контексте, тебе нужно на каждый поток, создавать новый контекст

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

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

проблемма как раз в том и есть, что для одного контекста SaveChanges выполняется в разных потоках, дополнительный скоп тут и не нужен, а вот поставить lock либо, повторюсь использовать разные контексты поможет делу
...
Рейтинг: 0 / 0
Entity Framework: многопоточность и транзакции
    #38142194
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation, я глядел код ровно до слова Serializable. приминительно к этому коду, похоже вы правы. но смысла в авторском подходе нет. хозяин барин.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework: многопоточность и транзакции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]