|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Здравствуйте! У меня возникла проблема в моем приложении, связанна она с одновременным доступом нескольких пользователей на редактирование одной и той же записи в таблице. Почитав мануалы, я вычитал, что в EntityFrameWork по умолчанию нет ограничений на одновременное редактирование одной записи несколькими пользователями. Что я нашел для решения этого вопроса: 1. Аннотация [ConcurrencyCheck] на определенное поле 2. Аннотация [Timestamp] public byte[] RowVersion { get; set; } это на строку в целом. Решение как оказывается есть, но оно не решает задачу полностью. Так как это работает только тогда, когда пользователь захочет сохранить данные. А за это время другой пользователь может открыть туже самую запись, и изменить поля, а при сохранении у вылетит ошибка о том что эту строку уже кто-то вперед его сохранил. Соответственно, все что второй пользователь вносил было напрасно. Как реализовать так, чтобы второй пользователь изначально видел, что строка уже редактируется первым пользователем до её сохранения в базу данных первым пользователем? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 09:30 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
На мой взгляд, решение нужно не на уровне EF, а выше - на уровне программной логики. То есть вести пул, кто какие записи открывает на редактирование (необязательно в конкретной таблице, возможно общий подход на всё приложение). Тогда никто не помешает другим пользователям просматривать эту запись в режиме "только для чтения", что часто важно в многопользовательском приложении. Проверка и блокировка происходит только тогда, когда пользователь пытается перейти в режим редактирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:04 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Shocker.ProНа мой взгляд, решение нужно не на уровне EF, а выше - на уровне программной логики. То есть вести пул, кто какие записи открывает на редактирование (необязательно в конкретной таблице, возможно общий подход на всё приложение). Тогда никто не помешает другим пользователям просматривать эту запись в режиме "только для чтения", что часто важно в многопользовательском приложении. Проверка и блокировка происходит только тогда, когда пользователь пытается перейти в режим редактирования. На уровне логики приложения, это велосипед придется лепить причем с кучей исключений. Так как у меня wpf с реализацией постраничной. Пользователь может гулять по взаимосвязанным формам редактирования. Я то думал что можно использовать какой-то стандартный набор инструментов для реализации этой задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:18 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Почитай про оптимистическую блокировку . Может найдешь подход разрешения конфликтов, который тебя устроит. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:28 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Стандартного набора нет, т.к. сама задача нестандартна. Как выше писали, это бизнесовый кейс и отрабатывать его придётся велосипедом. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 13:12 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Dima TПочитай про оптимистическую блокировку . Может найдешь подход разрешения конфликтов, который тебя устроит. http://professorweb.ru/my/LINQ/linq_sql/level13/13_1.php Читаю пока это, возможно это тоже подойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 13:25 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиСтандартного набора нет, т.к. сама задача нестандартна. Как выше писали, это бизнесовый кейс и отрабатывать его придётся велосипедом. хехе это всегда была стандартно задачей то что кто то сделал стандартом оптимистическую блокировку не означает что пессимизм уже никому не нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 16:09 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
NechtoКак реализовать так, чтобы второй пользователь изначально видел, что строка уже редактируется первым пользователем до её сохранения в базу данных первым пользователем? Каким-то образом определять, что запись была изменена на моменте сохранения и решать что с этим делать: перезаписать, предупредить пользователя о перезаписи или что-то ещё. Смотря что тебе нужно. Определять изменение можно по времени изменения, или по штампу изменений, или по истории изменений. Миллион вариантов. Процесс обновления локать, но аккуратно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 16:33 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRosэто всегда была стандартно задачей Так там кейсов море "что делать, если"... В стандарты никак не лезет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 16:50 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
Смузи, До ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 17:13 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRos, после ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 17:13 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRos, блокировать всю запись - плохо. Нужно блокировать только поля, а это уже бизнесовая фича. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 19:49 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRos, блокировать всю запись - плохо. Нужно блокировать только поля, а это уже бизнесовая фича. Ты знаешь как это устроено? Или исходишь от "запись заблокирована"? Будут блокированы некоторые поля (запись примитивного типа), если тип композитный :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 20:25 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRos, Никакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 20:26 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
В MSSQL есть блокировки уровня приложения sp_getapplock , но они привязаны к соединению, а оно постоянно меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 20:29 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRosНикакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй! Не понимаю, какой еще паттерн. БД не может эскалировать column level блокировки, в движке ADO.NET тоже нет такого, ORM тоже такое не поддерживают (есть некоторые вещи, но этого мало). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 20:52 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRosНикакая эта не бизнес фича, а архитектурный паттерн - Разделяй и властвуй! Не понимаю, какой еще паттерн. БД не может эскалировать column level блокировки, в движке ADO.NET тоже нет такого, ORM тоже такое не поддерживают (есть некоторые вещи, но этого мало). Ну я то в этом не виноват :) Блокировать можно и нужно (это очень частое требование, особенно у тех, у кого (по их мнению) много секретов (которые интересны только им самим воще то)) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 20:57 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRosБлокировать можно и нужно Так я ж не против. Вопрос в том, как это делать. 1. Пользователь начал редактировать конкретное поле записи, взвели таймстэмп в связке с identity. 2. Save => таймстэмп обнулили. 3. Пока таймстэмп не обнулен, другим пользователям не доступно поле для редактирования. 4. Плюс заложили дельту времени на простой с автообнулением таймстэмпа. Вот тебе и вся архитектура :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 21:08 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRosБлокировать можно и нужно Так я ж не против. Вопрос в том, как это делать. 1. Пользователь начал редактировать конкретное поле записи, взвели таймстэмп в связке с identity. 2. Save => таймстэмп обнулили. 3. Пока таймстэмп не обнулен, другим пользователям не доступно поле для редактирования. 4. Плюс заложили дельту времени на простой с автообнулением таймстэмпа. Вот тебе и вся архитектура :) Надо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 21:22 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRosНадо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения. Не вижу противоречий. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 22:07 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRosНадо рассчитывать на то что с БД работают и другие приложения и им пофиг твои соглашения. Не вижу противоречий. что то не въехал, старею что ль :( как твоя конструкция мешает мне сделать Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 22:46 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRos, а твоя защищает от админского DROP DATABASE? Не понимаю проблемы. Если ты в обход логики что-то на стороне апдейтишь, какой смысл уповать на ту самую логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 22:53 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRos, а твоя защищает от админского DROP DATABASE? Не понимаю проблемы. Если ты в обход логики что-то на стороне апдейтишь, какой смысл уповать на ту самую логику. 1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий. 2. Защищает. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 22:56 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
ViPRos1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий. 2. Защищает. Я ж намекнул, что все приложения должны ходить в БД через единое API. Если это не так, то грошь цена твоей песочнице. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 23:30 |
|
c# параллелизм в EntityFramework
|
|||
---|---|---|---|
#18+
СмузиViPRos1. Ну я ж сказал, что с БД могут работать разные приложения и они чихали на твои внутриприложенческие соглашения об этичности некоторых действий. 2. Защищает. Я ж намекнул, что все приложения должны ходить в БД через единое API. Если это не так, то грошь цена твоей песочнице. Мусь, не начинай. Никто не будет переписывать свои зоопарк из какого-то сраного ОРМ, который не умеет работать с пессимизме и требует - О УЖОС!!! - какие то ДТО (что за зверь, с чем едят, какой недоумок придумал?) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 23:43 |
|
|
start [/forum/topic.php?fid=17&msg=39352075&tid=1349337]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
139ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 237ms |
total: | 481ms |
0 / 0 |