Большинство файловых систем (но не все) используют блокировку для защиты одновременного доступа к одному и тому же файлу. Блокировка может быть исключительной, поэтому первый пользователь, получивший блокировку, получает доступ, а последующие пользователи получают ошибку «отказано в доступе». В вашем примере сценария пользователь A сможет прочитать файл и получить блокировку файла, но пользователь B не сможет писать, пока пользователь A читает.
Некоторые файловые системы (например, NTFS) позволяют указывать уровень блокировки, например, для одновременного чтения, но без записи. Возможны также блокировки байтового диапазона.
В отличие от баз данных, файловые системы обычно не являются транзакционными, не атомарными, и изменения от разных пользователей не являются изолированными (если изменения даже можно увидеть - блокировка может запретить это).
Использование блокировок всего файла - это грубый подход, но он защитит от непоследовательных обновлений. Не все файловые системы поддерживают блокировки целых файлов, и поэтому обычной практикой является использование файла блокировки - обычно пустого файла, присутствие которого указывает, что связанный с ним файл используется. (Создание файла является атомарной операцией в большинстве файловых систем.)