weranda
@weranda

Возможна ли одновременная запись данных в один файл?

Приветствую
Задумался вот над чем. Допустим я разместил функцию записи введенных из формы данных в файл. Два пользователя одновременно, с точностью до миллисекунд, сделали одно и то же действие — нажали кнопку отправки данных. Что произойдет — запишутся данные в файл или нет и почему?
  • Вопрос задан
  • 686 просмотров
Решения вопроса 1
VladimirAndreev
@VladimirAndreev
php web dev
если работа с файлами организована правильно - то кто-то один немного подождет, пока запишет другой.
если все совсем печально - то сработает принцип "кто последний - тот и папа".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
В условиях гонки лучший вариант база данных, файл требует чётких регламентов доступа.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Два пользователя одновременно, с точностью до миллисекунд, сделали одно и то же действие — нажали кнопку отправки данных. Что произойдет — запишутся данные в файл или нет и почему?

Зависит от того, как организована запись в файл, от ОС и от файловой системы. Например, на уровне стандарта POSIX гарантируется, что в случае, когда запись выполняется единственным системным вызовом write, а файл был открыт в режиме "для добавления", то запись должна выглядеть атомарно. Т.е. данные, записанные успешно завершившимся системным вызовом будут записаны в файл непрерывным участком. Однако, write в праве записать меньше данных, чем было запрошено (о чём он сообщит кодом возврата). Точно так же, для записи несколькими потоками или процессами в один расшаренный файл гарантируется атомарность записи и сдвига текущей позиции файла. Для других случаев (не-POSIX, не одним системным вызовом, не-O_APPEND не через расшаренный файловый дескриптор) таких гарантий нет.
Для винды -- хз, есть ли там гарантии и какие, лень искать.
Ответ написан
Комментировать
kagary06
@kagary06
Человек
Исходя из вопроса трудно понять каким образом запланирована работа вашего приложения и как построена обработка ошибок, но в любом случае Вам нужно каким-то образом помечать какой пользователь совершил добавление информации.

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

Задумайтесь над тем, чтобы хранить данные во встроенных базах данных (sqlite, tinydb, CodernityDB) - для десктопных программ, или же реляционных базах данных (MySQL, PostgreSQL, MS SQL, ...) - для серверных решений.

Если не использовать базы данных, то обычно после задач хранения данных следуют задачи по поиску и изменению данных и Вам самостоятельно нужно будет реализовывать необходимые для этого алгоритмы. А для этого требуется достаточно хорошо ознакомится с принципами хранения данных в файлах (Flat-file Database, File Storage и т.д.)
К тому же нужно будет реализовывать механизм владениями файлами (блокировки, лимиты по времени и правам доступа), чтобы избежать "состояния гонки" (параллельная работа нескольких пользователей с одним файлом).
Ответ написан
Комментировать
Два пользователя одновременно, с точностью до миллисекунд, сделали одно и то же действие — нажали кнопку отправки данных. Что произойдет — запишутся данные в файл или нет и почему?
Нихрена не выйдет. Фундаментальные ограничения физики - принцип неопределённости Гейзенберга для действия (произведения энергии на время).
К тому же на уровне диска запись относительно процессора медленная, нерасторопная, последовательная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы