|
|
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Здравствуйте У пользователя есть клиент, грубо говоря - это список заявок. Юзер может открыть одну из заявок и начать ее редактировать (заявка содержит поля: клиент, адрес, телефон). Если то же самое начнет делать второй юзер с той же самой заявкой и, например, раньше первого отредактирует что-то, то первый будет иметь дело с неправильными данными... Вопрос: Есть ли механизм в MySQL, который бы блокировал запись от изменений? И лучше бы на некоторое время Решал эту проблему, введением еще одного поля-флага к записи, но в таком случае при разрыве соединения, естественно флаг оставался в заблокированном виде и доступ к заявке получить было нельзя Как решаются подобные проблемы в программах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 10:03:38 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Stark3, Как один из вариантов - дополнительное поле может быть не просто флагом, а датой/временем блокировки. Периодически проверять, слишком долго висящие сессии отшибать, блокировку снимать (в поле писать NULL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 10:10:41 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
На еще один вариант натолкнула реализация сохранения настроек в хроме, т.е. кнопка "сохранить" отсутствует и сохранение происходит после выхода из редактируемого поля, с обновлением всех полей. Таким образом я вижу самую актуальную информацию. Но этот способ более ресурсоемкий в плане апдейта по 1 запросу или сразу всей пачкой. Есть еще варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 10:35:37 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Stark3На еще один вариант натолкнула реализация сохранения настроек в хроме, т.е. кнопка "сохранить" отсутствует и сохранение происходит после выхода из редактируемого поля, с обновлением всех полей. Таким образом я вижу самую актуальную информацию. Но этот способ более ресурсоемкий в плане апдейта по 1 запросу или сразу всей пачкой.У этого способа основной недостаток вовсе не в ресурсоемкости, а в отсутствии транзакционности. Пользовательский документ - сущность куда более сложная, чем один пункт настроек в Хроме. И данные этого документа (потенциально разбросанные по множеству таблиц) должны изменяться согласованно в одной транзакции. Иначе очень быстро вместо данных получите хлам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 10:39:06 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Да, ваша правда, уже уткнулся в три связанных поля. Или диалог тоже таким образом не сделать Пожалуй, остановлюсь на вашем варианте с использованием флага времени и его проверкой перед открытием заявки, спасибо Получается, такие проблемы так и решаются? например в 1с ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 11:02:54 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Stark3Получается, такие проблемы так и решаются? например в 1сДалеко не только так. Еще можно использовать блокировки на уровне СУБД, дополнительные таблицы для промежуточного редактирования документов и многое другое. А уж как оно в 1С - понятия не имею. Это лучше спросите в профильном подфоруме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 11:08:58 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Stark3Если то же самое начнет делать второй юзер с той же самой заявкой и, например, раньше первого отредактирует что-то, то первый будет иметь дело с неправильными данными... Почему Вы думаете, что это первый вводит правильные данные, а второй - неправильные? Не может быть наоборот?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:41:33 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Необходимо просто построить грамотную систему арбитража коллизий. Одним из вариантов может быть такой. Данные никогда не изменяются. Вместо этого у каждой записи есть дополнительное поле валидности, поле идентификатора оператора-создателя и штамп времени создания. Изменение данных фактически означает, что у текущей записи ставится признак невалидности, и создаётся новая запись, с новыми данными и новым штампом времени. Это обеспечивает хранение истории изменений. Что же до арбитража - то клиентская часть обязана при выполнении записи изменённых данных убедиться, что изменяемая запись не была изменена другим сеансом (для этого вполне подходит select ... for update). При обнаружении коллизии, вероятно, оператор должен получать сведения об актуальном состоянии записи, и принимать решение об её изменении. Если он примет решение внести изменение, это будет зафиксировано в БД (ИД оператора!) - случись что, при "разборе полётов" сразу определится, кому выписывать клизьму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:49:56 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
PS. Конечно, поле валидности кажется лишним - валидность можно формально определять по максимальности штампа времени. Но это более "тяжёлое" по нагрузке решение. Впрочем, для непакетных, чисто интерактивных, работ с данными вполне возможно и такое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:52:08 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
AkinaPS. Конечно, поле валидности кажется лишним - валидность можно формально определять по максимальности штампа времени. Но это более "тяжёлое" по нагрузке решение. Впрочем, для непакетных, чисто интерактивных, работ с данными вполне возможно и такое решение. я бы предложил не валидность, и клиенту следить не менялись ли данные....про последнее как???? чтобы клиент не сделал, он либо не гарантирует что данные пока он думал не поменялись, либо этот процес думанья при активной блокировке приведёт к подвисанию всех процесов которые ждут освобождение этого лока. в субд добавить поле, аля хеш или любая другая юник фигня, которая тригером меняеться при каждом изменении данных тип датавремя с автообновлением...для высоких нагрузок где в секунду может пройти несколько изменений не очень хорош. и изменения делать по другому Апдейт трали вали ГДЕ допол_хеш_юник_или_както_так_поле = заданой величине. если запись менялась пока мы телились, обновление не произойдёт, ибо хеш не совпадёт. но это путь, когда нам надо логика если петя хочет менять, то нельзя менять, если петя видел более старые данные чем на момент изменения. ЗЫ пример, есть поле зашифрованая величина, и хеш этой величины. петя щитал значение ШИФР(мой пароль) и ХЕШ(мой пароль) поставил новый пароль - новый1пароль, за это время вася тоже менял этот же пароль - поставив новый2пароль. если последним менял петя, то петин и будет активный...противоречия в данных нету. нам важно лишь чтобы зашифрованное значение и хеш были от одной и тойже строки. и плевать что формально, петя вводя старый пароль, водил очень старый, который пока он заполнял форму васей был изменён... если логика позволяет не париться - можно просто не париться на эту тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 17:12:35 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
AkinaНеобходимо просто построить грамотную систему арбитража коллизий. 1Одним из вариантов может быть такой. Данные никогда не изменяются. Вместо этого у каждой записи есть дополнительное поле валидности, поле идентификатора оператора-создателя и штамп времени создания. Изменение данных фактически означает, что у текущей записи ставится признак невалидности, и создаётся новая запись, с новыми данными и новым штампом времени. Это обеспечивает хранение истории изменений. Что же до арбитража - то клиентская часть обязана при выполнении записи изменённых данных убедиться, что изменяемая запись не была изменена другим сеансом (для этого вполне подходит select ... for update). При обнаружении коллизии, вероятно, оператор должен получать сведения об актуальном состоянии записи, и принимать решение об её изменении. Если он примет решение внести изменение, это будет зафиксировано в БД (ИД оператора!) - случись что, при "разборе полётов" сразу определится, кому выписывать клизьму. как вариант, на момент сохранения, выводить сохраняющему новые знчения , те , которые были изменены другим, юзером, пока данный редактировал у себя на клиенте, - пусть данный юзер решает, чьи изменения важнее, и принимает решение: сохранить свои или отказаться от сохранения. что будет неплохим дополнением к 1 варианту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 18:23:05 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Stark3например в 1сА вот и статья на тему случайно подвернулась - Блокировки данных в 1С:Предприятии 8 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 22:05:05 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
а вот они для mysql http://m.habrahabr.ru/post/238513/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 06:48:14 |
|
||
|
изоляция данных
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПочему Вы думаете, что это первый вводит правильные данные, а второй - неправильные? Не может быть наоборот?.. Кто первый начал редактировать - тот и папа, второй будет смотреть уже изменненые данные. В проекте miksoftА вот и статья на тему случайно подвернулась - Блокировки данных в 1С:Предприятии 8 . спасибо вадяа вот они для mysql http://m.habrahabr.ru/post/238513/ спасибо, видел. К сожалению ручное управление коммитами транзакций не приветствуется, т.к. клиент теоретически может в любой момент отпасть, соответсвенно, "игры" с их блокировками на уровне субд тож не айс я остановился на варианте с полем-флагом и проверкой по времени. Т.к. практически "пересечения" пользователей редки, но теоретически вариант нужно предусмотреть. Усложнять не хочется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2014, 12:38:38 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38760236&tid=1834158]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 449ms |

| 0 / 0 |
