Привет.
Какие есть техники обеспечения непротиворечивости данных, которые могут редактировать одновременно много пользователей? В частности, интересуют подходы к обработке параллельного добавления противоречащих бизнес-логике данных. Например, пользователь не должен состоять во враждующих сообществах "линуксоиды" и "виндузятники" единовременно, но в других - без ограничений; как без полной блокировки таблицы обработать ситуацию, когда запросы, добавляющие пользователя в оба из них, приходят одновременно.
> Привет.
> Какие есть техники обеспечения непротиворечивости данных, которые могут редактировать
> одновременно много пользователей? В частности, интересуют подходы к обработке параллельногоЧерез блокировку.
> добавления противоречащих бизнес-логике данных. Например, пользователь не должен состоять
> во враждующих сообществах "линуксоиды" и "виндузятники" единовременно, но в других -
> без ограничений; как без полной блокировки таблицы обработать ситуацию, когда запросы,
> добавляющие пользователя в оба из них, приходят одновременно.Посмотрите как эта проблема решается в git.
> Через блокировку.Блокировку чего именно? Если всей таблицы, то это как-то слишком грустно. Для ясности могу сказать, что юзаю MySQL/InnoDB.
> Посмотрите как эта проблема решается в git.
А где именно она встречается в гите? И как вообще называется эта проблема, а то я даже хз, какие формулировки гуглить..
>> Через блокировку.
> Блокировку чего именно? Если всей таблицы, то это как-то слишком грустно. Для
> ясности могу сказать, что юзаю MySQL/InnoDB.
>> Посмотрите как эта проблема решается в git.
> А где именно она встречается в гите? И как вообще называется эта
> проблема, а то я даже хз, какие формулировки гуглить..По идее, кооперативное редактирование или типа того.
Я бы на вашем месте сделал просто. При открытии для редактирования загружается время последнего изменения. При сохранении вы его шлете в форме. Если на сервере уже сохранена более новая версия, пользователю выдается ошибка. Пользователь как-нибудь разруливает и сохраняет новую версию.
>[оверквотинг удален]
>> Блокировку чего именно? Если всей таблицы, то это как-то слишком грустно. Для
>> ясности могу сказать, что юзаю MySQL/InnoDB.
>>> Посмотрите как эта проблема решается в git.
>> А где именно она встречается в гите? И как вообще называется эта
>> проблема, а то я даже хз, какие формулировки гуглить..
> По идее, кооперативное редактирование или типа того.
> Я бы на вашем месте сделал просто. При открытии для редактирования загружается
> время последнего изменения. При сохранении вы его шлете в форме. Если
> на сервере уже сохранена более новая версия, пользователю выдается ошибка. Пользователь
> как-нибудь разруливает и сохраняет новую версию.1. имеем проблему.
2. "как-нибудь разруливает"
3. ПРОФИТ!!!: )
> Через блокировку.В принципе, да, через блокировку такое разруливать можно, но это выглядит слабопереносимо между разными СУБД/движками и требует очень вдумчиво составлять схему и способы блокировок. Кроме того, JPA очень странно с этим работает, такое ощущение, что есть более лучший путь.
Феномен(тм), который я "изобрёл", давно известен под именем read skew/write skew. Читать полезно.
Техники очень простые.1. MQ с запросамии на уровне приложения (7!)
2. Анализируешь на непротиворечивость всю очередь, прежде чем позволить параллельную обработкуНе тащи бардак в базу данных, там уже гарантированно не разберёшься.
> 1. MQ с запросамии на уровне приложения (7!)
> 2. Анализируешь на непротиворечивость всю очередь, прежде чем позволить параллельную обработкуА можно пример использования?
CONSTRAINT constraint_name CHECK ( expression )