Файловое хранилище для файлов с одновременным доступом
От: corpse56  
Дата: 25.01.22 22:14
Оценка:
Здравствуйте!
Задача не новая, но я не соображу как правильно поискать по теме. Опишу своими словами.

В одной информационной системе к одной из сущностей прикреплен файл. На данный момент он прикреплен в виде ссылки на сетевую папку, которая хранится в базе данных. То есть для доступа к файлу клиент кликает по соответствующему полю на форме и ему открывается в проводнике папка содержащая этот самый файл. Всё прекрасно.

Теперь правила меняются. Файл должен хранится в базе. Запихнуть существующие файлы в базу и организовать их получение и загрузку не трудно. У меня возникают вопросы по поводу совместного доступа к одному и тому же файлу.
Например два пользователя хотят редактировать один и тот же файл. Они их скачивают к себе, редактируют и загружают обратно. При таком сценарии изменения будут только от последнего загрузившего.

Удалось сообразить два сценария, которые могут это предотвратить:

1. Если файл необходимо отредактировать (то есть скачать к себе, изменить и загрузить изменённый), пользователь запускает режим редактирования, при котором все остальные пользователи не могут загружать изменённый файл до тех пор, пока пользователь сам не закроет режим редактирования либо истечёт время, отведённое на блокировку. То есть все ждут, пока пользователь не закончит режим редактирования. Это похоже на пессимистическую блокировку, если я правильно понимаю.

2. При скачивании файла, вычисляем его хэш, а когда пытаемся загрузить изменённый файл, то проверяем хэш. Если хэш изменился, значит даём отлуп и просим скачать файл заново. Это вроде как оптимистическая блокировка.

В первом сценарии пользователи будут негодовать, что не могут загрузить мелкие изменения в файле (а потом и вовсе забыть, что что-то менял), во время того, как один из пользователей работает с файлом целый день, во втором сценарии пользователи будут ворчать от того, что изменения, которые они проделали в файле, нужно будет заново вносить в новую версию файла, при чём теоретически это может произойти подряд несколько раз.

Система эта не высоконагруженная. Около 50 пользователей. Конечно, случай конкурентного доступа маловероятен. Но тем не менее, хотелось бы узнать как решать такую задачу?

Спасибо!

пс
использую .NET C#

извините за сумбур.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.