Одновременное чтение данных разными пользователями не вызывает никаких проблем при работе в сети.
Одновременное изменение БД с разных мест может привести к конфликтам. Специальные Средства FoxPro предназначены для разрешения этих конфликтов.
Основные типы конфликтных (недопустимых) ситуаций при работе в сети
1) Несколько операторов имеют одновременный доступ для редактирования одной и той же записи ( один и тот же счет в банке по запросу разных клиентов может повлечь снятие большей суммы, чем там имеется)
2) Несколько операторов имеют одновременный доступ ко многим или всем записям БД. ( Например, руководство торговой организации может пожелать изменить цены всех товаров в справочнике из-за изменения курса доллара, и при этом обслуживание клиентов не должно прерываться).
3) Пользователь делают радикальные изменения данных, например,
Insert
Modify structure
Pack
Reindex
Zap
Такие действия совершенно исключают доступ к БД с других рабочих мест и выполняются только в монопольном режиме.
FoxPro может открывать БД в 2-х режимах :
· Монопольном
· Сетевом (разделенном, многопользовательском, коллективном - синонимы)
Таким образом, при работе программы в сетевом режиме в сети возможны следующие ситуации:
1) Пользователь открывает БД для монопольной работы. В этом случае БД закрыта для других, как для чтения, так и для записи.
2) Пользователь открывает БД в сетевом режиме. В определенный момент пользователь временно захватывает БД для ввода/редактирования данных. Остальные операторы в это время могут только читать файл .
3) Пользователь открывает БД в сетевом режиме. В определенный момент пользователь временно захватывает одну запись. Остальные операторы могут только читать эту запись.
4) Пользователь открывает БД в сетевом режиме. Никто из операторов не редактирует данные. БД доступна всем.
1)
use kad
go top
@ 1,1 get fio picture “xxxxxxxxxxxxxxxx”
read
Происходит автоматический захват записи ( read lock) . Другие пользователи могут ее только читать. Их попытки редактирования пресекаются с выдачей системного сообщения.
Разрешение конфликта – использование временных переменных. Последовательность действий:
- scatter - запись полей БД во временные переменные
- редактирование
- replace или gather – запись в БД с помощью ее временной блокировки
a)
use kad
go top
scatter to t
@ 1,1 say “ таб № = ” get t(1) picture “xxxxx”
@ 2,1 say “ФИО = ” get t(2) picture “xxxxxxxxxxxxxxxx”
read
gather from t (!!! - кратковременное обращение к записи БД)
b)
use kad
go top
scatter to memvar
@ 1,1 say “ таб № = ” get m.TN picture “xxxxx”
@ 2,1 say “ФИО = ” get m.FIO picture “xxxxxxxxxxxxxxxx”
read
gather from memvar
2) При работе в сети исключаются ввод/редактирование данных с помощью Browse/change. В данной среде их можно только просматривать.
Средства FoxPro, обеспечивающие работу в сети
Set exclusive off
( по умолчанию – on)
Тогда команда
Use kad
Открывает БД в режиме коллективного использования (сетевом режиме).
2) Если в случае обшей установке Set exclusive off
надо одну или несколько БД открыть в монопольном режиме, то
use <файл> exclusive
3)функция
Flock(<область>)
Делает попытку блокировки БД в текущей или другой рабочей области. Если блокировка не удалась, то функция возвращает .f., в противном случае .t.
Пример
Use kad
If flock()
gather from memvar
Endif - это запись в БД с блокировкой
4) lock/rlock(<область>)/[[выражение С], область])
блокирует одну или несколько записей
if rlock(’25,26,34’, kad)
……….
Endif
Замечание. Возможность множественной блокировки доступна, только если установлено
Set multilocks on
( по умолчанию – off)
5) Unlock [in <область>/ all]
Снимает блокировку записей / файлов
Пример
Use kad
If flock()
Replace Tn from m.tn, fio from m.fio
Unlock
Endif
- это основной шаблон действий с БД в сетевом режиме.
6) Организация автоматического повтора попыток блокировки в течение заданного времени или заданное число раз
set reprocess to <Выр n> [seconds] / to automatic
<Выр n> - число повторных попыток блокировки ( от 1 до 32 000. Попытки повторяются 18.3 раза в секунду. Нажатие ESC не прерывает попыток захвата данных, даже если установлено
set escape on.
<Выр n> seconds – количество секунд, в течение которых будут выполняться эти попытки.
Automatic - попытки блокировки будут выполняться непрерывно. При этом на экране будет предъявлено системное сообщение «attempting to lock… Press ESC to cancel”.
Замечание 1. Команда Append blank блокирует заголовок БД. Следовательно, никакая другая команда, изменяющая заголовок, не может быть выполнена в данный момент ( т.е. нужен захват всей БД).
Замечание 2. Более удобным средством включения новой записи в сетевом режиме является команда insert. При этом программист не заботится о блокировке.( заботится сам SQL).
Замечание 3. Упаковка данных - только в монопольном режиме.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.