|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
Я бы тоже обсудил требования - возможно получиться обойтись более простым решением - блокировка записи. Иначе концептуально это выглядит так: 1. Есть клиент и сервер 2. Клиент имеет грид, с режимом просмотра (когда ячейку выделили) и режимом редактирования (когда на ячейку ткнули два раза и в ней появился курсор) 3. Когда ячейка вошла в режим редактирования - на сервер отправляется информация - ид записи, номер ячейки, флаг блокировки, кто блокирует 4. Сервер рассылает эту информацию другим клиентам 5. Каждый из клиентов находит у себя эту запись у себя и блокирует ячейку (обводит красным, блокирует режим редактирования и т.п.) Есть два режима уведомления: 1. Когда клиент периодически запрашивает изменения с сервера 2. Когда сервер рассылает изменения клиентам Первый вариант: Минусы: может дать сбой, если период запроса изменений с сервера будет довольно большим (ну там 10 сек или минута), а если будет очень маленьким - возрастает нагрузка на сервер. Как делать: на сервере таблица блокировок, каждый клиент каждую секунду/десять/минуту идет в эту таблицу, забирает обновления и обновляет свое состояние Второй вариант: Минусы: если отвалилась сеть - уведомление с сервера не дойдет, сбой, либо прикручивать систему подтверждения доставки уведомления. Как делать: нужна рассылка, значит на сервере нужен список активных клиентов с их адресами, каждый клиент должен уметь принимать данные и обновлять свое состояние. На ходу на ум приходит две технологии рассылок - в сервере приложений, через сервер БД. Сервер приложений: программный сервер, полностью пишется сам или используются готовые решения (ну например frozenmountain websync, signalr - хотя это для веба я использовал, можно погуглить для вин-формс, а в websync были примеры для нативных iOS приложений). Сервер БД: его можно настроить на уведомления клиентов об изменении данных в таблицах, например в MS SQL это делается, насколько я помню, через data broker и SqlDependency - тогда каждый клиент настраивает для себя эту штуку и натравливает ее на MS SQL. В Oracle тоже есть нечто подобное. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2014, 11:45 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
SerP1983, ВИПРОС владеет всей информацией о БД, ВИПРОС эту БД строит, потому он не только данные умеет синхронизировать без проблем, но и сливает разные модели, выделяет подсхемы в отдельные модели и т.д. на самом деле оптимистическая стратегия - это просто отложенная пессимистическая с офигенным осложнением потому я и сказал про приговор в том смысле, что все равно придется в пессимизме разрешать коллизии несмотря на кажущуюся простоту, оптимизм намного сложнее чем пессимизм (конечно если не все время буркнуть фигню типа - "извините, данные уже накрылись вместо с вашими трудами", а реально попытаться разрешать коллизии) но если прога нифига не сечет в семантике модели, не может на автомате перестроить данные, перезапустить обновления с учетом вновь поступивших и т.д. (т.е привести в семантически правильную форму), то разрешение коллизий автоматом - невыполнимая задача потому я считаю что все эти ОРМ создали впечатление, что работа с БД - простая фигня но так как вы тут воще то с БД не работаете, то в принципе вас эти вещи и не должны волновать, да и не волнует ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 16:45 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
и еще, с подачи мальчика и поддакивания модераторов вы тут стали полными козлами ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 16:47 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggsterТаблица в пользовательском приложении представлена в виде сетки. вся целиком? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 17:17 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ViPRos, Я не получил ответ на свой вопрос. Повторю вопрос, за 2 раза, видимо, смысл до тебя не дошел: покажи как решаются вопросы блокировки и разрешения коллизий в випрос. Мне не нужны тут рассуждения, про пессимистические и оптимистические блокировки, которые, кстати, описываются в приведенных мною ссылках (о ужас, випрос может оказаться детской поделкой). Просто покажи как випрос делает это. Про перестроить данные - бред, какой еще поискать надо. У тебя випрос циферки в финансовых документах сам по себе не перестраивает случаем? И, Саха, тут нет козлов, а вот опускаться до уровня оскорбления оппонентов - низко. И заметь, ты сам начал корчить из себя самого умного. Давай докажи теперь, что это так. Пока я вижу от тебя пердежи в лужу и бред, что странно наблюдать, от самого умного, не находишь? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 19:26 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
SerP1983, с оскорблений со своими пуками начал ты и продолжаешь по теме что тебе доказывать - то что информированный и уполномоченный алгоритм сильнее чем неинформированный и неуполномоченный? ВИПРОС волею судеб изначально был построен для случаев дополнения и перестроения данных для получения осмысленных состояний модели при оффлайн работе, при котором невозможно ни по каким критериям построить очередь, обслуживания которой приводила бы валидному состоянию модели (можно в качестве примера посмотреть на работу версионника, которая пытается разрешить коллизии между версиями, но у него нет никакого ума, и вся информированность там заканичивается временными метками). Что бы такое было возможным было усилено понятие Модель, что привело к расширению и ужесточению ЕР модели, ООП парадигмы, использования РМД в целях хранения такой модели. Это все описано в документации. Мало кто въезжает и видит выгоду, но пытаются в жизни пользоваться и пока что вроде более менее успешно. Дальше видно будет что с этим сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 19:53 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ViPRos, Ну ты ж опять сливаешься. И ЕР ты хотя бы по-английски написал, а то ведь Единая Россия выходит. Вот зачем ты мне поришь околомаркетинговую чушь? Расширение ООП парадигмы у него. Как у тебя пользователи в один и тот же момент времени работают с одними и теми же данными, ты можешь на это ответить? ВОт ты пример привел с временной меткой, хороший пример. А в випрос то как это устроено? 4-й раз уже один и тот же вопрос задаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 20:09 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
SerP1983, ты просто не читаешь "при одновременной" работе (т.е. все в онлайне) создается блокирующая очередь, это самый дешевый алгоритм синхронизации и тут не надо (ну, во всяком случае если не совсем хочешь отказаться от движков субд существующих, а так можно было бы и тут проанализировать запросы и перестроить очередь обслуживания, по возможности оттягивая время принятия решения) изобретать что либо ну а в офлайне сначала строиться очередь обслуживания, которая приводит (обычно, так как изначально наложены запреты на ввод говна) к валидному состоянию ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 20:25 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ViPRos, То есть ключевое "создается блокирующая очередь"? Я правильно понял, что это и есть pessimistic lock? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 20:37 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
SerP1983, ну да, это простейший случай синхронизации, если модель не позволяет себя нарушать и каждая транзакция во валидно меняет состояние модели или просто нет модели ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 20:55 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ты типа пытаешься доказать что то амебное видение проблемы (поддержка валидного состояния модели при конкуренции) есть теория? да там даже слово нет о модели. это черно-белое видение большой семантической проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 21:03 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ViPRos, Теория (греч. θεωρία — рассмотрение, исследование) — учение, система идей или принципов. Можно ли назвать pessimistic и optimistic lock принципами? Я считаю, можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 21:23 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
SerP1983, я не против, тем более что ты не один просто мне показалось, что тебя интересует решение проблемы, а не пути отфутболивания ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2014, 21:27 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
у MS SQL есть поле типа ROWVERSION (TIMESTAMP). Оповещения нужно делать через сервер приложений. А уж как он там отслеживать будет изменения - это клиентов не парит. Хоть проводить все опреации через него, хоть через SqlDependency отслеживать изменения... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 10:07 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ViPRos, Чтобы решить проблему, надо понять, что решать. У меня возникло ощущение, что топикастер вообще плохо разбирается в теме. Вот я и отправил его к истокам. Можно ли назвать это отфутолил, не знаю, но та информация была бы для него полезна, по моему мнению. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 10:45 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
Коллеги, прошу прощение за долгое отсутствие. Мне подумалось вот что: Заказчик не требует блокировки редактируемой записи. Только алерт о том, что она редактируется (кем то), и информацию о том, что она была отредактирована кем то, до того, как ты нажал кнопку "сохранить" на данной записи (ну или вышел из строчки грида, когда она была dirty, и она соответственно, полезла сохранятся [заказчик требует, чтобы "было как в excel"]). Я так понимаю, что это - разные задачи. Информация о том, что "пока ты телился - запись обновили", решается добавлением в табличку поля timestamp, ну и, соответственно, генерацией ошибки на уровне пишущей хранимки, если таймстампы в твоей копии и в таблице - отличаются. Ну и дополнительный режим этой хранимки "пишем всё равно, пофиг на изменения" (ну, когда затираем редактирование предыдущего пользователя). Тут, правда, наверное, надо будет еще подумать, как обыграть ситуацию, когда запись обновили еще раз, пока пользователь размышлял над ответом "затирать/не затирать". Вторая задача - это, собственно, показать, что запись сейчас редактируется. Мне наилучшим решением видится, что все пользователи будут слать в некую таблицу ИД записи, ИД клиента, код захватил/отпустил. Возможно, что туда же эту информацию будут слать триггеры after insert/update/delete, определенные на целевой таблице. Сборщик мусора на сервере будет удалять из этой таблицы строки, относящиеся к тем, на которых уже нет блокировок (чтобы очередь не росла), возможно, с некоторым лагом. На эту табличку думаю навесить select на клиенте с привязанной к нему Query Notification (не знаю что за зверь, буду курить). По идее, эта штуковина должна сообщать нам, если выборка на стороне сервера изменится. Т.е., если нам прилетит сообщение от выборки, что она - поменялась, мы должны перечитать данные из таблицы "блокировок", расставить по другому значки редактирования и выборочно перечитать записи. Остается проблема со сборкой мусора в случае сбоя клиента. Частично это можно решить, думаю, так: Если клиент вошел в другую запись, то все его предыдущие блокировки - отменяются. Если клиент залогинился на сервер - то же самое. Если клиент обновил запись - то, видимо, он потерял ее блокировку. Здесь везде блокировка - это "блокировка", т.е. ничего не блокируется, просто имеется информация о том, что с записью работает пользователь. Проблема в том, что если клиент потерял коннект абнормально - вот тут ничего не сделаешь. Триггера на logoff у MSSQL вроде нету. Не устоялось в голове. Ткните в слабые места, пожалуйста! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 17:05 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggster, а не проще-ли заказчику Google Docs или Office 365 использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 17:32 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
а какой смысл для пользователя видеть некое уведомление о том, что его запись сейчас кем-то редактируется? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 17:37 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
ТС, посмотри тут (может тебе такое подойдёт решение): Блокировка процедуры от повторного запуска ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 17:40 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggster, ...почему не хранить тогда версии, а окончательное сохранение истинной отдать на усмотрение главного/супервайзера/инспектора пожарной охраны? ... если никто не решится - сохранять последнюю ... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 17:46 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
Konst_Oneа какой смысл для пользователя видеть некое уведомление о том, что его запись сейчас кем-то редактируется? В общем, это требование заказчика. Они хаотически кусками обрабатывают один и тот же набор записей с разных машин. Каждый пользователь, в общем, редактирует свой кусок данных и свою часть записи, но проблема в том, что они могут пересекаться. Я понимаю, звучит не очень убедительно, но так есть. carrotikuaggster, ...почему не хранить тогда версии, а окончательное сохранение истинной отдать на усмотрение главного/супервайзера/инспектора пожарной охраны? ... если никто не решится - сохранять последнюю ... В общем, отредактированные записи всё равно будут сваливаться в "историческую" таблицу триггером. Проблема в том, что пользователь должен увидеть, что при одновременном редактировании он "успел позже". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 18:12 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggsterсвою часть записи ТЗ - негодное, это понятно. что есть своя часть записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:58 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggster"успел позже". это по-русски или по-болгарски написано? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2014, 19:59 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
Изопропилuaggsterсвою часть записи ТЗ - негодное, это понятно. что есть своя часть записи? Некая информация, которая у него на бумажном документе. Она соответствует части строки или полной строке в той выборке, которую обрабатывает оператор. Проблема в том, что таких "слегка пересекающихся" частей может быть несколько (и в разных местах, у разных людей). Оператор, исходя из имеющихся на руках первичных документов должен решить, обновлять или нет запись, либо ограничится проставлением некого признака. И да, нормализовать эту штуку - нельзя. Всё и так достаточно нормализовано. Просто стиль работы с документами несколько... ну вы поняли. Изопропилэто по-русски или по-болгарски написано? Зато понятно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2014, 08:56 |
|
Как реализовать одновременное редактирование таблицы несколькими пользователями?
|
|||
---|---|---|---|
#18+
uaggster, 17-77 в 16792084 по-моему, все хорошо расписал, плюсы и минусы. Я сам больше склоняюсь к серверу приложений, так как это лучше подходит под требования, да и возможности там побогаче, например, уведомления и отслеживание разрыва связи делаются очень просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2014, 09:51 |
|
|
start [/forum/topic.php?fid=20&msg=38795535&tid=1402271]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 360ms |
total: | 485ms |
0 / 0 |