|
Программирование >> Разработка пользовательского интерфейса
Транзакциями в Visual FoxPro называется набор операций, которые: изменяют данные, но могут рассматриваться как одна единица; могут управлять конкурирующими изменениями данных; могут использоваться для более легкого управления в целях перехвата ошибок. Транзакции обеспечивают наибольшую защиту существующим данным. Транзакции могут использоваться отдельно, либо вместе с буферизацией записи или таблицы. Только таблицы, которые находятся в базе данных, могут воспользоваться транзакциями. Visual FoxPro предоставляет три команды, которые обеспечивают контроль за транзакциями: BEGIN TRANSACTION - предназначена для инициализации транзакции. ROLLBACK - выполняет откат всех изменений, сделанных после последней команды BEGIN TRANSACTION. изменен статус удаления. Если какой-нибудь пользователь в сети сделает изменения в буферизованной таблице, любые изменения, которые вы попытаетесь записать на диск с помощью функции TABLEUPDATE(), приведут к конфликтной ситуации, кроме, конечно, случая, когда вы используете функцию TABLEUPDATE() с двумя аргументами, равными .T. (=TABLEUPDATE(.T.)). Можно разрешить конфликтную ситуацию с помощью функций OLDVAL() и CURVAL(). Функция CURVAL() возвратит значение на диске в текущий момент, а OLDVAL() - значение поля записи в момент, когда началась буферизация. В качестве примера внесем еще несколько изменений в форму JUSTMADEFORMFORBUFFERVALIDATING. Добавьте кнопку, к примеру, с заголовком Все-таки изменить и сделайте ее изначально недоступной. Код для события Click кнопки Сохранить перепишите следующим образом: GO GETNEXTMODIFIED(0) k=TABLEUPDATE(.F.) IF k = .F. This.Parent.Command3.Enabled=.T. ENDIF ThisForm.Grid1.SetFocus Для кода события Click кнопки Все-таки изменить напишите следующий код: =TABLEUPDATE(.F.,.T.) This.Enabled=.F. ThisForm.Grid1.SetFocus Для события Click кнопки Отменить внесите следующие несущественные изменения: =TABLEREVERT(.F.) ThisForm.Command3.Enabled=.F. ThisForm.Grid1.SetFocus В итоге у вас получится форма, которая будет работать следующим образом. Когда вы внесете изменения в одни и те же записи и в первом и во втором образце формы, то после нажатия кнопки Сохранить вы попадете на первую измененную запись. Если никаких проблем не возникнет, то есть значение CURVAL() и OLDVAL() совпадет, то значение будет сброшено из буфера на диск. В случае возникновения проблем, если переменная k примет значение .F., то станет доступна кнопка Все-таки изменить и при этом в текстовых полях Text1 и Text2 вы увидите и значения, возвращаемые функциями OLDVAL() и CURVAL(). То есть у вас есть вся информация для принятия решения. При особом желании вы можете модифицировать вашу форму так, что будет возможность при конфликтных ситуациях восстанавливать значение, которое имело поле до начала буферизации, то есть то значение, которое возвратит функция OLDVAL(). END TRANSACTION - блокирует записи, записывает на диск все изменения, сделанные после ближайшей команды BEGIN TRANSACTION, затем снимает блокировку с записей. Изменения в таблицах, в индексных файлах CDX и в полях примечаний таблиц, которые принадлежат базам данных, могут использовать команды транзакций. Транзакции могут работать только с полями таблиц или представлений, но не с переменными памяти и другими объектами. Изменения выполняются в конце транзакции. Транзакция кэширует изменения на диске или в памяти. Когда транзакция заканчивается, изменения записываются на диск. Если изменения не могут быть записаны на диск, вся транзакция целиком откатывается и ни одно изменение не завершается. Транзакции обеспечивают встроенную систему, которая защищает базу данных от разрушения с помощью отмены всех изменений, в случае если по каким-то причинам изменения не могут быть записаны на диск. Транзакции откатываются путем возвращения всех измененных записей и индексов в первоначальное состояние. Для большей надежности защиты данных транзакции следует использовать вместе с буферизацией для предотвращения потери данных. Транзакции могут иметь пять уровней вложенности. Если вы попытаетесь добавить шестой уровень, то будет сгенерирована ошибка. Когда вы изменяете записи в базе данных, которая является частью транзакции, другие пользователи в сети не могут иметь доступа (чтения и запись) к этим записям, пока не завершится транзакция. Если другие пользователи в сети пытаются получить доступ к записям, которые вы модифицируете, им придется ждать завершения транзакции. Они будут получать сообщение Record not available<193>Please Wait ( Запись не доступна. Подождите, пожалуйста ), пока записи не станут доступны. Поэтому необходимо делать транзакции как можно меньше по длине или проводить транзакции в то время, когда другие пользователи не нуждаются в доступе к данным. Команда END TRANSACTION сохраняет все изменения, сделанные в таблицах, индексных файлах CDX и полях примечаний, и заканчивает транзакцию. Все изменения, сделанные в базе данных между предыдущей командой BEGIN TRANSACTION и END TRANSACTION, завершаются. Если транзакция является транзакцией первого уровня или единственной транзакцией (то есть транзакцией без вложенности), то изменения записываются на диск. Если транзакция вложенная, то END TRANSACTION переводит все кэшированные изменения на следующий уровень. Вложенные транзакции обладают потенциальной возможностью переписать изменения, сделанные в транзакции на более высоком уровне. В случае если в это время завершается еще одна транзакция, команда END TRANSACTION сгенерирует ошибку. Имеет смысл вставить в цикл команду END TRANSACTION, которая будет работать до тех пор, пока транзакция не сможет завершиться. Для того чтобы сделать откат транзакции, которая началась с помощью команды BEGIN TRANSACTION, используйте команду ROLLBACK. Эта команда восстановит первоначальное состояние таблиц, индексов и полей примечаний. Когда вам необходимо выяснить, на каком уровне вложенности вы находитесь в процессе транзакции, используйте функцию TXNLEVEL(). Ниже приведен простейший пример ее использования: OPEN DATA auto store USE Model BEGIN TRANSACTION ??TXNLEVEL **** Будет выведено значение 1, которое равняется ***** текущему уровню транзакции BEGIN TRANSACTION ?? TXNLEVEL **** Будет выведено значение 2, которое равняется ***** текущему уровню транзакции END TRANSACTION END TRANSACTION Теперь рассмотрим основные правила работы с транзакциями. Транзакции должны объявляться с помощью команды BEGIN TRANSACTION. Если будут выполняться команды END TRANSACTION или ROLLBACK без соответствующей команды BEGIN TRANSACTION, то будет сгенерирована ошибка. Транзакции действуют, пока не будут выполнены команды END TRANSACTION или ROLLBACK. Транзакции могут проходить через несколько процедур или функций. Если приложение заканчивается без команды END TRANSACTION, то выполняется команда ROLLBACK. Транзакции используют данные, кэшированные в буфере транзакции, а не данные на диске, для того чтобы использовать самые новые данные. Транзакции не могут переписать существующий индексный файл с помощью команды INDEX. Транзакции могут использоваться только с таблицами, принадлежащими базам данных. Если вы включили ручную блокировку таблицы или файла во время транзакции с помощью функций FLOCK() и RLOCK(), то необходимо обязательно снять блокировку. Команда END TRANSACTION не снимет блокировку. Во вложенных транзакциях команды ROLLBACK и END TRANSACTION работают с изменениями, которые произошли после последней команды BEGIN TRANSACTION. Изменения внутри вложенных транзакций не запишутся на диск, пока не завершится самый верхний уровень, то есть не будет выполнена самая последняя команда END TRANSACTION. Если транзакции выполняются над одними и теми же данными, то преимущество имеет то изменение, которое было выполнено последним, независимо от того, на каком уровне оно находится. Например: USE Account BEGIN TRANSACTION BEGIN TRANSACTION REPLACE count WITH 103 FOR count=203 END TRANSACTION REPLACE count WITH 203 FOR count 103 END TRANSACTION В таблице значение поля так и останется равным 203. Перепишем данный пример так, что последняя команда REPLACE будет выполняться перед следующим уровнем вложенности: USE Account BEGIN TRANSACTION REPLACE count WITH 203 FOR count 103 BEGIN TRANSACTION REPLACE count WITH 103 FOR count=203 END TRANSACTION END TRANSACTION Теперь значение поля останется тем же, что и было - 103. Несколько советов по увеличению производительности при работе в сети в приложениях Microsoft Visual FoxPro Если локальная станция имеет достаточно места на жестком диске или достаточно RAM, то вы можете улучшить производительность, разместив временные файлы на локальном диске или на RAM диске. Перенаправление этих файлов на локальный диск или диск RAM увеличивает производительность за счет уменьшения обращения к сетевому диску. Вы можете указать альтернативное местонахождение для этих файлов, включив выражения EDITWORK, SORTWORK, PROGWORK и TMPFILES в ваш файл CONFIG.FPW. Если есть возможность отсортировать данные, то имеет смысл это сделать, так как работа с таблицами происходит быстрее, если у вас не включены индексы. То есть используйте поиск с помощью команды, а затем отключайте порядок индекса. Если есть возможность работать с какими-то файлами монопольно, то используйте эту возможность, так как при монопольном режиме доступ к таблицам осуществляется быстрее. Чтобы уменьшить вероятность попытки одновременного доступа к записи или таблице, сокращайте время блокировок, что можно осуществить, блокируя записи только при сохранении данных на диск, а не во время их редактирования. Оптимистическая буферизация обеспечивает вам кратчайшее время блокировки. Microsoft Access Средства настройки оболочки Access позволяют установить режимы по умолчанию для открытия баз данных и таблиц. Для этого используется команда Параметры в меню Сервис. После
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |