|
Программирование >> Разработка пользовательского интерфейса
блокировка завершилась успешно. Автоматические блокировки удерживаются внутри транзакции до тех пор, пока не произойдут запись или откат на самом верхнем уровне вложения. Ручные блокировки остаются в действии и после завершения транзакции. Единственный способ освободить запись - это снять блокировку вручную. В следующем примере блокируются первые четыре записи: OPEN DATABASE auto store SET REPROCESS TO 3 AUTOMATIC STORE 1,2,3,4 TO cRecList cOldExcl=SET( EXCLUSIVE ) SET EXCLUSIVE OFF USE model ?LOCK(cReclist,model) UNLOCK IN model SET EXCLUSIVE &cRecList Буферизация защищает данные во время изменений. Буфер автоматически тестирует, блокирует и освобождает записи и таблицы. Существуют два типа буферизации: записи и таблицы, которые защищают такие операции, как модификация данных и их поддержка на уровне одной или нескольких записей. При использовании буферизации Visual FoxPro копирует запись в память или на диск. Первоначальная запись все еще остается доступной для других пользователей. Когда указатель записи перемещается или совершается попытка ее модификации программным путем, Visual FoxPro пытается заблокировать запись, проверяет, что другой пользователь не сделал никаких изменений, и затем записывает изменения на диск. Хорошо при этом иметь задействованный обработчик ошибок для разрешения конфликтов, которые могут случиться при попытке записать изменения в таблицу. Буферизация записи отличается от буферизации таблицы тем, что при первом типе изменения записываются в таблицу либо при перемещении указателя, либо при использовании функции TABLEUPDATE(). При буферизации таблицы изменения записываются только после использования функции TABLEUPDATE(). Буферизация устанавливается с помощью функции CURSORSETPROP(). После установки буферизация она остается в действии до ее отключения с помощью той же функции CURSORSETPROP(), либо до закрытия таблицы. Режимы блокировки, используемые с буферизацией, определяют, когда записи блокируются и как блокировка с них снимается. Существуют два режима блокировки: пессимистический и оптимистический. Пессимистическая блокировка препятствует доступу других пользователей в многопользовательской среде к записи или таблице во время их редактирования. Пессимистический режим блокировки наиболее надежный для изменения индивидуальных записей, но он может замедлить пользовательские операции. Оптимистическая блокировка - более производительный способ редактирования записей, так как блокировка устанавливается только на момент внесения изменений на диск, что значительно уменьшает время, в течение которого один пользователь монополизирует систему в многопользовательском режиме. Когда вы используете буферизацию для внешних таблиц, Visual FoxPro устанавливает оптимистическую блокировку. Для установки пессимистической блокировки записи используйте функцию CURSORSETPROP() и следующие параметры: = CURSORSETPROP( Buffering ,2) Visual FoxPro пытается заблокировать запись, на которой установлен указатель. Если блокировка завершилась успешно, Visual FoxPro помещает запись в буфер и разрешает редактирование. Когда вы перемещаете указатель записи или выполняете функцию TABLEUPDATE(), Visual FoxPro записывает данные из буфера в таблицу. Для установки оптимистической буферизации записи используйте функцию CURSORSETPROP() и следующие параметры: = CURSORSETPROP( Buffering ,3) Когда вы перемещаете указатель записи или выполняете функцию TABLEUPDATE(), Visual FoxPro пытается блокировать запись. Если блокировка успешно завершена, Visual FoxPro сравнивает текущее значение записи на диске со значением перед началом буферизации. Если эти значения одинаковые, изменения записываются в таблицу, если же значения разные, то Visual FoxPro генерирует ошибку. ! Properties - form buffer.sc3t Object: Forml Data Methods LaiJOut Other
Occurs when a FormSet, Form, or Page object becomes active or when a ToolBar object is shown. Рис. 7.17. После сохранения формы запустите ее из командной строки вначале с помощью следующей команды: DO FORM justmadeformforbufferingvalidate NAME f1 А затем запустите эту же форму, но уже с другим именем DO FORM justmadeformforbufferingvalidate NAME f2 Если вы хотите установить пессимистическую блокировку нескольких записей, то используйте функцию CURSORSETPROP() следующим образом: = CURSORSETPROP( Buffering ,4) В этом случае Visual FoxPro пытается блокировать запись, на которой находится указатель. При успешном завершении блокировки Visual FoxPro помещает запись в буфер и разрешает редактирование. Таким образом вы можете заблокировать несколько записей и все их, естественно, поместить в буфер. После того, как вы используете функцию TABLEUPDATE(), все данные из буфера будут переписаны на диск. Вас может смутить то, что буферизация как правило в документации и литературе упоминается как буферизации таблицы , а блокируется не таблица, а несколько редактируемых записей. Для проверки вышесказанного используйте возможность Visual FoxPro запускать одну и ту же форму несколько раз в разных сессиях данных. При этом каждую сессию данных вы можете рассматривать как отдельного сетевого пользователя. Первым делом создайте форму, поместите в нее объект Grid. Теперь для формы установите значение свойства BufferMode равным 1 (pessimistic), а значение свойства DataSession равным 2 (private data session), как это показано на рис. 7.17. \f, Work Area Properties Data Buffering Options- Enable Data Buffering Lock Records When Edited С When Written ГВ uf f er- С Current Record < All Edited Records Cancel ModifiJ.. Data Filter Index Order I <no order> rAllow Access to- (* AJI Fields in the work area С Onlv fields specified by Field Filter Field Filter.. c: \proiect book\larisa. dbf Рис. 7.18. Теперь в первом экземпляре формы отредактируйте, например, первую и вторую запись, а во втором - третью и четвертую. Как видите, таблицы не заблокированы, но в то же время при попытке отредактировать первую или вторую запись во втором экземпляре вы получите сообщение о том, что запись в данный момент редактируется другим пользователем. И так будет продолжаться до тех пор, пока вы не примените функцию TABLEUPDATE() в сессии данных, связанной с первым экземпляром формы, и в рабочей области, где открыта ваша таблица. Для установки оптимистической блокировки нескольких записей используйте следующее выражение: = CURSORSETPROP( Buffering ,5) В этом случае Visual FoxPro записывает данные в буфер и разрешает редактирование до тех пор, пока вы не выполните функцию TABLEUPDATE(). После этого Visual FoxPro совершает следующие действия над каждой записью в буфере: 1. Пытается блокировать каждую отредактированную запись. 2. После успешной блокировки сравнивает текущее значение на диске со значением до начала буферизации. 3. Записывает данные на диск, если сравнение прошло успешно. 4. Генерирует ошибку, если данные различаются. Для доступа к данным в буфере можно использовать функцию RECNO(). Номер записи из таблицы используется для обращения к ее аналогу в буфере. Если записи добавляются, то при установленной буферизации они вначале попадают в буфер, и номер вновь добавленной записи отрицательный. Отрицательные числа последовательно нарастают по абсолютному значению по мере добавления записей. В табл. 7.6 представлена ситуация, которая может сложиться при добавлении двух записей. Таблица 7.6. Порядок нумерации записей в буфере Номер записи Операция 4 Редактируется 9 Редактируется В диалоговом окне View Window с помощью списка CurrentSession можете проверить, что у вас на данный момент загружено несколько сессий данных, а точнее, одна плюс количество экземпляров нашей формы. Если вы таким же способом загрузите еще одну форму, то количество сессий данных, как вы уже догадались, увеличится на единицу. В окне View Window, переключившись в одну из сессий данных, связанных с одним из экземпляров нашей формы, перейдите в рабочую область, в которой открыта таблица, данные из которой отображаются с помощью объекта Grid. Нажав на кнопку Properties, вы можете увидеть, что буферизация для данной таблицы действительно пессимистическая и множественная (рис. 7.18).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |