Эта проблема не имеет ничего общего с groovy/grails, но является лишь фундаментальной проблемой одновременной модификации файла. Вы должны справиться с этой проблемой так же, как система управления исходным кодом (SCCS), такая как SVN или CVS.
В частности, сохраните время последнего изменения файла. Это можно сохранить в самом файле, в метаданных файла или в другом файле, который предоставляется каждый раз при загрузке файла XML. Когда пользователь загружает файл, проверьте, был ли он изменен (другим пользователем), так как он получил копию. Если у него есть, у вас есть несколько вариантов:
- Дайте ему самые последнюю копию и сказать ему, чтобы объединить изменениям себя (это то, что дерьмовый SCCS будет делать)
- Try и автоматически объединит изменения если они не конфликтуют (это будет лучший SCCS). Если есть конфликты, они должны быть разрешены вручную пользователем.
Одним из подходов (который может быть излишним) является использование SCCS для решения этой проблемы с версией. Существует Java API for CVS (и, вероятно, для других SCCS), который позволяет вам программно проверять, проверять и объединять файл.
Данное предложение предполагает, что вам необходимо разрешить одновременную модификацию файла. Если вы этого не сделаете, было бы проще решить проблему, используя подход, запрещающий одновременную модификацию.
Update: Некоторой информация о version
собственности, один из упомянутых комментаторов доступны в разделах 5.3.5 и 5.5.2.7 в Grails reference manual
Если они редактируют его через веб-страницу, а в файле xml есть объект домена, вы можете использовать атрибут version для опции 1;) –
Привет, Тим, есть ли у вас хорошие ссылки об атрибуте версии? Был быстрый взгляд на Google и окончательное руководство к книге Grails, и это определенно звучит как хороший способ идентифицировать экземпляры одновременной модификации, но Wikipedia говорит (http: //en.wikipedia.org/wiki/Optimistic_concurrency_control), что это может быть не самый эффективный способ справиться с этим. Также проработанный пример будет удобен :-) – Armand