Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 [ 80 ] 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

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

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

При чтении этого параграфа вы

• ознакомитесь с основными особенностями разработки пользовательского приложения, которое предназначено для работы в локальной сети.

• подготовитесь к решению возможных сетевых конфликтов, которые могут возникнуть у пользователей при работе с приложением в сети.

Visual FoxPro

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

Visual FoxPro обеспечивает работу с данными с помощью монопольного или раздельного доступа к данным, опций блокировки, буферизации таблиц и записей, а также поддержки транзакций. Помимо этого Visual FoxPro автоматизирует многоразовую установку среды окружения посредством сессий данных.

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

После выполнения команды SET EXCLUSIVE ON все таблицы будут открываться в монопольном режиме. Если необходимо проверить текущую установку, то используйте функцию SET() с аргументом EXCLUSIVE следующим образом:

? SET("EXCLUSIVE")

Если вы не хотите менять текущую установку в приложении для монопольного или многопользовательского режима открытия таблиц, то открывайте таблицу с помощью команды USE и точного указания, в каком режиме вы будете ее использовать. Например, если вам обязательно надо открыть таблицу в монопольном режиме, необходимо использовать следующую команду:

USE myfile EXCLUSIVE

В дополнение к монопольному или многопользовательскому режиму доступа к файлам вы можете управлять доступом к таблицам с помощью блокировок как файлов, так и записей. Блокировки могут обеспечить как долгосрочный, так и краткосрочный контроль над данными. Вдобавок, блокировки предотвратят одновременную модификацию двумя или более пользователями одной и той же записи или таблицы. Существуют два типа блокировок: автоматические и ручные.

Если выполняемая команда требует блокировки таблицы или записи и запись или таблица еще не заблокированы, Visual FoxPro автоматически пытается совершить блокировку, выполняет команду и снимает блокировку. Команды могут блокировать запись, целую таблицу или заголовок таблицы. Когда заблокирована запись, то другие пользователи могут добавлять, удалять и изменять другие записи, кроме заблокированной. Блокировка таблицы предотвращает любые изменения другими пользователями в таблице. Блокировка заголовка занимает промежуточное положение, другие пользователи могут изменять записи, но не могут удалять и добавлять записи.

В табл. 7.5 приводятся команды, которые осуществляют автоматическую блокировку, и указано, какой вид блокировки они выполняют.



Таблица 7.5. Команды, осуществляющие автоматическую блокировку в Visual FoxPro

Команда

ALTER TABLE APPEND

APPEND BLANK

APPEND FROM

APPEND FROM ARRAY

APPEND MEMO BLANK

BROWSE, CHANGE,

EDIT

CURSORSETPROP() DELETE DELETE NEXT 1 DELETE RECORD <

>

DELETE <<область

>>

DELETE-SQL GATHER INSERT INSERT-SQL MODIFY MEMO READ

RECALL RECALL NEXT 1 RECALL RECORD <

>

RECALL

<< область>>

REPLACE REPLACE NEXT 1 REPLACE RECORD <

>

REPLACE

<< область>>

SHOW GETS

TABLEUPDATE() UPDATE UPDATE-SQL

Что блокируется

Вся таблица Вся таблица Заголовок таблицы Вся таблица Заголовок таблицы

Текущая запись Текущая запись

Текущая запись и связанные по текущему полю записи в дочерних или родительских таблицах, как только началось редактирование

Зависит от параметров

Текущая запись

Текущая запись

Запись < >

Вся таблица

Текущая запись Текущая запись Вся таблица Заголовок таблицы

Текущая запись после начала редактирования

Текущая запись и все записи из других таблиц, связанные по редактируемым полям

Текущая запись

Текущая запись

Запись < >

Вся таблица

Текущая запись и все записи из других таблиц, связанные по редактируемым полям

Текущая запись и все записи из других таблиц, связанные по редактируемым полям

Запись < > и все записи из других таблиц, связанные по редактируемым полям

Вся таблица и все связанные таблицы

Текущая запись и все записи из других таблиц, связанные по редактируемым полям

Вся таблица

Вся таблица

Вся таблица

Иногда бывает необходимо применить ручную блокировку. Visual FoxPro блокирует текущую таблицу с помощью функции FLOCK(). В отличие от команды SET EXCLUSIVE ON, которая предотвращает любой доступ к таблице со стороны других пользователей, FLOCK() блокирует таблицу, оставляя ее доступной для чтения. Остальные пользователи могут открывать таблицу и просматривать записи, даже не задумываясь о том, что она заблокирована. FLOCK() блокирует текущую таблицу и возвращает .T., если блокировка прошла успешно.

Если в качестве аргумента функции вы укажете псевдоним или номер рабочей области, то у вас появится возможность заблокировать таблицу в другой, не текущей рабочей области. Например: FLOCK(1) или FLOCK(Account). Эта особенность очень полезна для блокировки связанных таблиц. RLOCK() и LOCK() блокируют текущую запись и возвращают .T., если



блокировка завершилась успешно.

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

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 генерирует ошибку.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 [ 80 ] 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146