Стандартное решение - запретить пользователям делиться одной записью. Не совсем понятно, почему так много пользователей возятся с одним и тем же экземпляром Order
.
Учтите, что Order
, вероятно, составной объект, и вы слишком много вложили в одну модель. Это первое и лучшее решение.
Если (по необъяснимым причинам) вы не разложите это, то вам придется создать транзакцию обновления из двух частей.
Запрос данных. Сравните с исходным запросом, выполненным для сеанса этого пользователя.
Если данные не соответствуют исходному запросу, кто-то другой изменил их. Изменения пользователя отменяются, откатываются, стираются, и пользователь видит новый запрос.
Если данные совпадают, вы можете попытаться зафиксировать изменение.
Приведенный выше алгоритм имеет условие состязания, которое обычно разрешается с помощью низкоуровневого SQL. Обратите внимание, что это делает работу пользователя недействительной, что делает его максимально раздражающим.
Вот почему ваш первый выбор - декомпозировать ваши модели, чтобы исключить параллелизм.
в моей модели есть поле "Разные заметки"
Это плохой дизайн. (а) Параллелизм разрушен столкновениями на этом поле. (б) Там нет журнала или истории комментариев.
Пункт (b) означает, что плохо ведущий себя пользователь может злонамеренно испортить эти данные. Если вы сохраняете заметки и комментарии в виде журнала, вы можете - в принципе - ограничивать пользователей только изменением их собственных комментариев.
[В большинстве баз данных с «различными примечаниями» поле стало дорогостоящим, трудно поддерживаемым, полным важных, но не поддающихся анализу данных. В разных заметках пользователи изобретают свои собственные процессы вне прикладного программного обеспечения. ]
«Разные заметки» должны рассматриваться как журнал, с неограниченным количеством заметок - с отметкой даты - идентифицируемых пользователем - добавляется к Заказу
Если вы просто разбиваете проект, чтобы поместить заметки в отдельную таблицу, вы решаете проблемы параллелизма.