Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# параллелизм в EntityFramework / 25 сообщений из 103, страница 1 из 5
22.11.2016, 09:30
    #39351602
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Здравствуйте!

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

Что я нашел для решения этого вопроса:
1. Аннотация [ConcurrencyCheck] на определенное поле
2. Аннотация
[Timestamp]
public byte[] RowVersion { get; set; } это на строку в целом.


Решение как оказывается есть, но оно не решает задачу полностью. Так как это работает только тогда, когда пользователь захочет сохранить данные. А за это время другой пользователь может открыть туже самую запись, и изменить поля, а при сохранении у вылетит ошибка о том что эту строку уже кто-то вперед его сохранил. Соответственно, все что второй пользователь вносил было напрасно.

Как реализовать так, чтобы второй пользователь изначально видел, что строка уже редактируется первым пользователем до её сохранения в базу данных первым пользователем?
...
Рейтинг: 0 / 0
22.11.2016, 10:04
    #39351616
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
На мой взгляд, решение нужно не на уровне EF, а выше - на уровне программной логики. То есть вести пул, кто какие записи открывает на редактирование (необязательно в конкретной таблице, возможно общий подход на всё приложение). Тогда никто не помешает другим пользователям просматривать эту запись в режиме "только для чтения", что часто важно в многопользовательском приложении. Проверка и блокировка происходит только тогда, когда пользователь пытается перейти в режим редактирования.
...
Рейтинг: 0 / 0
22.11.2016, 10:18
    #39351623
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Shocker.ProНа мой взгляд, решение нужно не на уровне EF, а выше - на уровне программной логики. То есть вести пул, кто какие записи открывает на редактирование (необязательно в конкретной таблице, возможно общий подход на всё приложение). Тогда никто не помешает другим пользователям просматривать эту запись в режиме "только для чтения", что часто важно в многопользовательском приложении. Проверка и блокировка происходит только тогда, когда пользователь пытается перейти в режим редактирования.

На уровне логики приложения, это велосипед придется лепить причем с кучей исключений. Так как у меня wpf с реализацией постраничной. Пользователь может гулять по взаимосвязанным формам редактирования.
Я то думал что можно использовать какой-то стандартный набор инструментов для реализации этой задачи.
...
Рейтинг: 0 / 0
22.11.2016, 10:28
    #39351630
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Почитай про оптимистическую блокировку .
Может найдешь подход разрешения конфликтов, который тебя устроит.
...
Рейтинг: 0 / 0
22.11.2016, 13:12
    #39351797
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Стандартного набора нет, т.к. сама задача нестандартна. Как выше писали, это бизнесовый кейс и отрабатывать его придётся велосипедом.
...
Рейтинг: 0 / 0
22.11.2016, 13:25
    #39351815
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Dima TПочитай про оптимистическую блокировку .
Может найдешь подход разрешения конфликтов, который тебя устроит.

http://professorweb.ru/my/LINQ/linq_sql/level13/13_1.php
Читаю пока это, возможно это тоже подойдет.
...
Рейтинг: 0 / 0
22.11.2016, 16:09
    #39351988
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиСтандартного набора нет, т.к. сама задача нестандартна. Как выше писали, это бизнесовый кейс и отрабатывать его придётся велосипедом.
хехе
это всегда была стандартно задачей
то что кто то сделал стандартом оптимистическую блокировку не означает что пессимизм уже никому не нужен
...
Рейтинг: 0 / 0
22.11.2016, 16:33
    #39352022
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
NechtoКак реализовать так, чтобы второй пользователь изначально видел, что строка уже редактируется первым пользователем до её сохранения в базу данных первым пользователем?

Каким-то образом определять, что запись была изменена на моменте сохранения и решать что с этим делать: перезаписать, предупредить пользователя о перезаписи или что-то ещё. Смотря что тебе нужно.

Определять изменение можно по времени изменения, или по штампу изменений, или по истории изменений. Миллион вариантов. Процесс обновления локать, но аккуратно.
...
Рейтинг: 0 / 0
22.11.2016, 16:50
    #39352052
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRosэто всегда была стандартно задачей
Так там кейсов море "что делать, если"... В стандарты никак не лезет.
...
Рейтинг: 0 / 0
22.11.2016, 17:13
    #39352074
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
Смузи,

До
...
Рейтинг: 0 / 0
22.11.2016, 17:13
    #39352075
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRos,

после
...
Рейтинг: 0 / 0
22.11.2016, 19:49
    #39352201
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRos, блокировать всю запись - плохо. Нужно блокировать только поля, а это уже бизнесовая фича.
...
Рейтинг: 0 / 0
22.11.2016, 20:25
    #39352226
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRos, блокировать всю запись - плохо. Нужно блокировать только поля, а это уже бизнесовая фича.
Ты знаешь как это устроено? Или исходишь от "запись заблокирована"?
Будут блокированы некоторые поля (запись примитивного типа), если тип композитный :)
...
Рейтинг: 0 / 0
22.11.2016, 20:26
    #39352227
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRos,

Никакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй!
...
Рейтинг: 0 / 0
22.11.2016, 20:29
    #39352231
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
В MSSQL есть блокировки уровня приложения sp_getapplock , но они привязаны к соединению, а оно постоянно меняется.
...
Рейтинг: 0 / 0
22.11.2016, 20:52
    #39352244
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRosНикакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй!
Не понимаю, какой еще паттерн. БД не может эскалировать column level блокировки, в движке ADO.NET тоже нет такого, ORM тоже такое не поддерживают (есть некоторые вещи, но этого мало).
...
Рейтинг: 0 / 0
22.11.2016, 20:57
    #39352246
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRosНикакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй!
Не понимаю, какой еще паттерн. БД не может эскалировать column level блокировки, в движке ADO.NET тоже нет такого, ORM тоже такое не поддерживают (есть некоторые вещи, но этого мало).
Ну я то в этом не виноват :)
Блокировать можно и нужно (это очень частое требование, особенно у тех, у кого (по их мнению) много секретов (которые интересны только им самим воще то))
...
Рейтинг: 0 / 0
22.11.2016, 21:08
    #39352251
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRosБлокировать можно и нужно
Так я ж не против. Вопрос в том, как это делать.
1. Пользователь начал редактировать конкретное поле записи, взвели таймстэмп в связке с identity.
2. Save => таймстэмп обнулили.
3. Пока таймстэмп не обнулен, другим пользователям не доступно поле для редактирования.
4. Плюс заложили дельту времени на простой с автообнулением таймстэмпа.
Вот тебе и вся архитектура :)
...
Рейтинг: 0 / 0
22.11.2016, 21:22
    #39352255
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRosБлокировать можно и нужно
Так я ж не против. Вопрос в том, как это делать.
1. Пользователь начал редактировать конкретное поле записи, взвели таймстэмп в связке с identity.
2. Save => таймстэмп обнулили.
3. Пока таймстэмп не обнулен, другим пользователям не доступно поле для редактирования.
4. Плюс заложили дельту времени на простой с автообнулением таймстэмпа.
Вот тебе и вся архитектура :)
Надо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения.
...
Рейтинг: 0 / 0
22.11.2016, 22:07
    #39352275
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRosНадо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения.
Не вижу противоречий.
...
Рейтинг: 0 / 0
22.11.2016, 22:46
    #39352290
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRosНадо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения.
Не вижу противоречий.
что то не въехал, старею что ль :(

как твоя конструкция мешает мне сделать
Код: sql
1.
update type set pole = фигня какая та where identity = нужная фигня ?
...
Рейтинг: 0 / 0
22.11.2016, 22:53
    #39352295
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRos, а твоя защищает от админского DROP DATABASE? Не понимаю проблемы. Если ты в обход логики что-то на стороне апдейтишь, какой смысл уповать на ту самую логику.
...
Рейтинг: 0 / 0
22.11.2016, 22:56
    #39352297
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRos, а твоя защищает от админского DROP DATABASE? Не понимаю проблемы. Если ты в обход логики что-то на стороне апдейтишь, какой смысл уповать на ту самую логику.
1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий.

2. Защищает.
...
Рейтинг: 0 / 0
22.11.2016, 23:30
    #39352310
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
ViPRos1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий.
2. Защищает.
Я ж намекнул, что все приложения должны ходить в БД через единое API. Если это не так, то грошь цена твоей песочнице.
...
Рейтинг: 0 / 0
22.11.2016, 23:43
    #39352314
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# параллелизм в EntityFramework
СмузиViPRos1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий.
2. Защищает.
Я ж намекнул, что все приложения должны ходить в БД через единое API. Если это не так, то грошь цена твоей песочнице.
Мусь, не начинай.
Никто не будет переписывать свои зоопарк из какого-то сраного ОРМ, который не умеет работать с пессимизме и требует - О УЖОС!!! -
какие то ДТО (что за зверь, с чем едят, какой недоумок придумал?)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# параллелизм в EntityFramework / 25 сообщений из 103, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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